Elasticsearch: diferencia entre "Término", "Frase coincidente" y "Cadena de consulta"

116

Nuevo aquí en Elasticsearch y tratando de comprender mejor la diferencia entre estas consultas. Por lo que puedo decir, termcoincide con un solo término (¿debe estar en minúsculas para que la coincidencia funcione?), Y ambos match phrasey query stringcoincide con una cadena de texto.

blee908
fuente

Respuestas:

226

termconsulta coincide con un solo término tal como está: el valor no se analiza . Por lo tanto, no tiene que estar en minúsculas dependiendo de lo que haya indexado.

Si proporcionó Bennetten el momento del índice y el valor no se analiza, la siguiente consulta no devolverá nada:

{
  "query": {
    "term" : { "user" : "bennett" }
  }
}

match_phrase query analizará la entrada si se definen analizadores para el campo consultado y encuentra documentos que coincidan con los siguientes criterios:

  • todos los términos deben aparecer en el campo
  • deben tener el mismo orden que el valor de entrada

Por ejemplo, si indexa los siguientes documentos (usando el standardanalizador para el campo foo):

{ "foo":"I just said hello world" }

{ "foo":"Hello world" }

{ "foo":"World Hello" }

Esta match_phraseconsulta solo devolverá el primer y segundo documento:

{
  "query": {
    "match_phrase": {
      "foo": "Hello World"
    }
  }
}

query_stringbúsqueda de consulta, de forma predeterminada, en un campo _todos que contiene el texto de varios campos de texto a la vez. Además de eso, se analiza y admite algunos operadores (Y / O ...), comodines, etc. (consulte la sintaxis relacionada ).

Como match_phraseconsultas, la entrada se analiza de acuerdo con el analizador configurado en el campo consultado.

A diferencia de match_phrase, los términos obtenidos después del análisis no tienen que estar en el mismo orden, a menos que el usuario haya utilizado comillas alrededor de la entrada.

Por ejemplo, utilizando los mismos documentos que antes, esta consulta devolverá todos los documentos:

{
  "query": {
    "query_string": {
      "query": "hello World"
    }
  }
}

Pero esta consulta devolverá los mismos 2 documentos que la match_phraseconsulta:

{
  "query": {
    "query_string": {
      "query": "\"Hello World\""
    }
  }
}

Hay mucho más que decir sobre las diferentes opciones para esas consultas, eche un vistazo a la documentación relacionada:

Espero que esto sea lo suficientemente claro y ayude.

ThomasC
fuente
¡Gran, maravillosa y completa explicación! Lo único que no tengo claro es qué es exactamente un análisis o qué hace ...
blee908
1
De nada :) Los analizadores procesan el texto para obtener los términos que finalmente se indexan / buscan. Lea estas páginas de la Guía definitiva de ElasticSearch, ya que este es un concepto realmente importante de comprender.
ThomasC
1
Sí, viniendo de SQL, hay muchas ideas nuevas aquí. La diferencia entre consultas y filtros, valores exactos frente a texto completo, objeto de búsqueda JSON y la forma en que la búsqueda elástica ejecuta su búsqueda. ¡MUCHO PARA COMPRAR! ¡Gracias por el recurso!
blee908
1
@ThomasC Si tuvieras {"foo": "Hola hermoso mundo"} en tu índice, ¿la consulta de coincidencias devolverá esto?
batmaci
1
@batmaci una matchconsulta usa el analizador si se analiza el campo, así que sí. Por defecto, devolverá documentos que tengan al menos uno de los términos (ver parámetro operator) y el orden no es importante.
ThomasC
17

Creo que alguien definitivamente está buscando diferencias entre ellos con respecto a la BÚSQUEDA PARCIAL Aquí está mi análisis con el 'analizador estándar' predeterminado : -

Supongamos que tenemos datos: -

{"name": "Hola"}

Ahora, ¿qué pasa si queremos hacer una búsqueda parcial con ell ???

Consulta de término O consulta de coincidencia

{"term":{"name": "*ell*" }

No funcionará, vuelva señalando.

{"term":{"name": "*zz* *ell*" }

No funcionará, vuelva señalando.

Conclusión : el término o la coincidencia no pueden realizar búsquedas parciales en absoluto

Consulta comodín: -

{"wildcard":{"name": "*ell*" }

Funcionará, dará el resultado {"name": "Hello"}

{"wildcard":{"name": "*zz* *ell*" }

No funcionará, vuelva señalando.

Conclusión : el comodín puede realizar una búsqueda parcial con un solo token

Query_string: -

{"query_string": {"default_field": "name","query": "*ell*"}

Funcionará, dará el resultado {"nombre": "Hola"}

{"query_string": {"default_field": "name","query": "*zz* *ell*" }

Funcionará para dar el resultado {"nombre": "Hola"}.

Conclusión : query_string puede buscar con dos tokens dados

-> aquí token son ell y zz

Opster Elasticsearch Pro-Vijay
fuente
wildcard is able to do partial search with one token only: más precisamente, las wildcardconsultas de forma predeterminada solo funcionan en keywordcampos , que por definición son de un solo token. Eso no tiene nada que ver con que el contenido del campo sea más de una palabra. En su consulta con comodines, "ozzy hello" coincidiría.
sox con Monica