Estoy usando ElasticSearch 5.2

Mi consulta es:

POST /_search
{
  "query": {
    "bool": { 
      "filter": [ 
        { "term":  { "tag": "server-dev.user-log" }} 
      ]
    }
  }
}

Puedo filtrar con un valor de etiqueta como abcd pero parece que no puedo con ab.cd

Supongo que esto se debe al Tokenizer. ¿Hay alguna manera de decir como equivalencia estricta? o si proviene del . para escapar?

La asignación de etiquetas es:

"tag": {
  "type": "text",
  "fields": {
    "keyword": {
      "type": "keyword",
      "ignore_above": 256
    }
  }
},
0
samidarko 24 mar. 2017 a las 12:42

2 respuestas

La mejor respuesta

Finalmente pude hacerlo funcionar como:

POST /_search
{
  "query": {
    "bool": { 
      "filter": [ 
        { "terms":  { "tag": ["server", "dev.user", "log"] }} 
      ]
    }
  }
}

Parece que - es un delimitador de token

Solo quiero agregar que mi configuración es muy estándar. No modifiqué el mapeo. El mapeo es creado por fluentd.

=======> EDITAR <=======

Si reemplaza tag por tag.keyword ya no necesita hacer la solución anterior (que por cierto no funciona con ningún valor)

POST /_search
{
  "query": {
    "bool": { 
      "filter": [ 
        { "term":  { "tag.keyword": "server-dev.user-log" }} 
      ]
    }
  }
}
0
samidarko 7 abr. 2017 a las 08:13

Lo más probable es que tenga un Analizador estándar para su etiqueta de campo y para un token server-dev.user-log, se proporcionarán los siguientes tokens:

{
    "tokens": [
        {
            "token": "server",
            "start_offset": 0,
            "end_offset": 6,
            "type": "<ALPHANUM>",
            "position": 0
        },
        {
            "token": "dev.user",
            "start_offset": 7,
            "end_offset": 15,
            "type": "<ALPHANUM>",
            "position": 1
        },
        {
            "token": "log",
            "start_offset": 16,
            "end_offset": 19,
            "type": "<ALPHANUM>",
            "position": 2
        }
    ]
}

Y, esa es la razón, no tiene coincidencia, por lo que lo que debería solucionarlo es agregar mapeo para una etiqueta de campo, con tokenizer que preservará todo el token. La opción más simple es KeywordAnalyzer, con configuraciones para un índice como este:

{
      "settings": {
        "analysis": {
          "analyzer": {
            "my_analyzer": {
              "tokenizer": "my_tokenizer"
            }
          },
          "tokenizer": {
            "my_tokenizer": {
              "type": "keyword"
            }
          }
        }
      },
      "mappings": {
        "my_type": {
          "properties": {
            "text": {
              "type": "tag",
              "analyzer": "my_analyzer"
            }
          }
        }
      }
    }
1
Mysterion 24 mar. 2017 a las 15:02