Elasticsearch: diferença entre “termo”, “frase de correspondência” e “string de consulta”

116

Novo aqui no Elasticsearch e tentando obter um melhor entendimento sobre a diferença entre essas consultas. Pelo que eu posso dizer, termcorresponde a um único termo (precisa estar em minúsculas para que a correspondência funcione?) E match phrasee query stringcorresponde a uma string de texto.

blee908
fonte

Respostas:

226

terma consulta corresponde a um único termo, tal como está: o valor não é analisado . Portanto, não precisa estar em letras minúsculas dependendo do que você indexou.

Se você forneceu Bennettno tempo do índice e o valor não foi analisado, a seguinte consulta não retornará nada:

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

match_phrase query irá analisar a entrada se analisadores forem definidos para o campo consultado e encontrar documentos que correspondam aos seguintes critérios:

  • todos os termos devem aparecer no campo
  • eles devem ter a mesma ordem do valor de entrada

Por exemplo, se você indexar os seguintes documentos (usando standardanalisador para o campo foo):

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

{ "foo":"Hello world" }

{ "foo":"World Hello" }

Esta match_phraseconsulta retornará apenas o primeiro e o segundo documentos:

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

query_stringpesquisa de consulta, por padrão, em um campo _all que contém o texto de vários campos de texto de uma vez. Além disso, é analisado e oferece suporte a alguns operadores (AND / OR ...), curingas e assim por diante (consulte a sintaxe relacionada ).

Conforme as match_phraseconsultas, a entrada é analisada de acordo com o analisador configurado no campo consultado.

Ao contrário de match_phrase, os termos obtidos após a análise não precisam estar na mesma ordem, a menos que o usuário tenha usado aspas ao redor da entrada.

Por exemplo, usando os mesmos documentos de antes, esta consulta retornará todos os documentos:

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

Mas esta consulta retornará os mesmos 2 documentos da match_phraseconsulta:

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

Há muito mais a dizer sobre as diferentes opções para essas consultas, por favor, dê uma olhada na documentação relacionada:

Espero que isso esteja claro o suficiente e ajude.

ThomasC
fonte
Explicação ótima, maravilhosa e completa! A única coisa que não tenho
certeza
1
De nada :) Os analistas processam o texto para obter os termos que são finalmente indexados / pesquisados. Leia estas páginas do Guia Definitivo ElasticSearch, pois este é um conceito muito importante de entender.
ThomasC
1
Sim, vindo do SQL, há muitas ideias novas aqui. A diferença entre consultas e filtros, valores exatos versus texto completo, objeto de pesquisa JSON e apenas a maneira como a pesquisa elástica está executando sua pesquisa. TANTO PARA RECEBER !!! Obrigado pelo recurso!
blee908
1
@ThomasC Se você tivesse {"foo": "Hello beautiful world"} em seu índice, a consulta de correspondência retornará isso?
batmaci
1
@batmaci uma matchconsulta usa o analisador se o campo for analisado, então sim. Por padrão, ele retornará documentos que contenham pelo menos um dos termos (ver parâmetro operator) e a ordem não é importante.
ThomasC
17

Acho que alguém definitivamente está procurando por diferenças entre eles no que diz respeito a PESQUISA PARCIAL. Aqui está minha análise com 'analisador padrão ' padrão : -

Suponha que temos dados: -

{"nome": “Olá”}

Agora, e se quisermos fazer uma pesquisa parcial com ell ???

Consulta de termo OU consulta de correspondência

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

Não vai funcionar, volte observando.

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

Não vai funcionar, volte observando.

Conclusão - O termo ou correspondência não consegue fazer pesquisa parcial

Consulta curinga: -

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

O resultado será {"name": "Hello"}

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

Não vai funcionar, volte observando.

Conclusão - o curinga é capaz de fazer pesquisa parcial com apenas um token

Query_string: -

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

Irá dar resultado {"nome": “Olá”}

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

Irá dar resultado {"nome": “Olá”}.

Conclusão - query_string é capaz de pesquisar com dois tokens fornecidos

-> aqui os tokens são ell e zz

Opster Elasticsearch Pro-Vijay
fonte
wildcard is able to do partial search with one token only: mais precisamente, as wildcardconsultas por padrão funcionam apenas em keywordcampos , que são, por definição, token único. Isso não tem nada a ver com o conteúdo do campo ser mais do que uma palavra. Em sua consulta curinga, "ozzy hello" corresponderia.
sox com Monica