Elasticsearch : "용어", "일치 구문"및 "쿼리 문자열"의 차이점


116

Elasticsearch의 새로운 기능이며 이러한 쿼리의 차이점을 더 잘 이해하려고합니다. 내가 알 수 term있는 한, 단일 용어와 일치하고 (일치하려면 소문자 여야합니까?) 및 둘 다 텍스트 문자열 match phrasequery string일치합니다.

답변:


226

term쿼리는 그대로 단일 용어와 일치합니다 . 값이 분석되지 않습니다 . 따라서 인덱싱 한 항목에 따라 소문자로 지정할 필요가 없습니다.

Bennett색인 시점에 제공 하고 값이 분석되지 않은 경우 다음 쿼리는 아무것도 반환하지 않습니다.

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

match_phrase 쿼리 된 필드에 분석기가 정의 된 경우 쿼리는 입력을 분석하고 다음 기준과 일치하는 문서를 찾습니다.

  • 모든 용어 가 필드에 나타나야합니다.
  • 입력 값 과 순서동일 해야합니다.

예를 들어 다음 문서를 색인화하는 경우 ( standard필드에 분석기 사용 foo) :

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

{ "foo":"Hello world" }

{ "foo":"World Hello" }

match_phrase쿼리는 첫 번째 및 두 번째 문서 만 반환합니다.

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

query_string한 번에 여러 텍스트 필드의 텍스트를 포함 하는 _all 필드 에서 기본적으로 쿼리 검색 . 또한 구문 분석되고 일부 연산자 (AND / OR ...), 와일드 카드 등을 지원합니다 ( 관련 구문 참조 ).

match_phrase쿼리 로서 입력은 쿼리 된 필드에 설정된 분석기에 따라 분석됩니다.

와 달리, match_phrase분석 후 얻은 용어는 사용자가 입력 주위에 따옴표를 사용하지 않는 한 동일한 순서 일 필요가 없습니다.

예를 들어 이전과 동일한 문서를 사용하면이 쿼리는 모든 문서를 반환합니다.

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

그러나이 쿼리는 쿼리와 동일한 2 개의 문서를 반환합니다 match_phrase.

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

이러한 쿼리에 대한 다양한 옵션에 대해 더 많은 의견이 있습니다. 관련 문서를 참조하세요.

이것이 충분히 명확하고 도움이되기를 바랍니다.


훌륭하고 훌륭하며 철저한 설명! 내가 명확하지 않은 유일한 것은 분석이 정확히 무엇인지, 무엇을 하는가입니다 ...
blee908

1
환영합니다 :) 분석기는 최종적으로 색인화 / 검색된 용어를 얻기 위해 텍스트를 처리합니다. 이해해야 할 매우 중요한 개념 이므로 ElasticSearch Definitive Guide의이 페이지를 읽으십시오 .
ThomasC 2014 년

1
예, SQL에서 왔는데 여기에 많은 새로운 아이디어가 있습니다. 쿼리와 필터의 차이, 정확한 값과 전체 텍스트, JSON 검색 개체, 그리고 탄력적 검색이 검색을 실행하는 방식입니다. 너무 많이 받아! 자원 주셔서 감사합니다!
blee908

1
@ThomasC 색인에 { "foo": "Hello beautiful world"}가있는 경우 일치 쿼리가 이것을 반환합니까?
batmaci

1
@batmaci match쿼리는 필드가 분석되면 분석기를 사용하므로 그렇습니다. 기본적으로 하나 이상의 용어 (매개 변수 참조 operator) 가있는 문서를 반환 하며 순서는 중요하지 않습니다.
ThomasC

17

나는 부분 검색 과 관련하여 그들 사이의 차이점을 확실히 찾고 있다고 생각합니다. 기본 '표준 분석기'를 사용한 분석은 다음과 같습니다 .

데이터가 있다고 가정합니다.

{ "name": "Hello"}

이제 우리가 ell로 부분 검색을하고 싶다면 ????

용어 검색어 또는 일치 검색어

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

작동하지 않을 것입니다.

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

작동하지 않을 것입니다.

결론 -용어 또는 일치는 부분 검색을 전혀 할 수 없습니다.

와일드 카드 쿼리 :-

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

결과 { "name": "Hello"}를 제공합니다.

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

작동하지 않을 것입니다.

결론 -와일드 카드는 하나의 토큰으로 만 부분 검색을 수행 할 수 있습니다.

Query_string :-

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

결과 { "name": "Hello"}를 제공합니다.

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

결과 { "name": "Hello"}를 제공합니다.

결론 -query_string은 두 개의 토큰으로 검색 할 수 있습니다.

-> 여기 토큰은 ell과 zz입니다.


wildcard is able to do partial search with one token only:보다 정확하게 wildcard는 기본적으로 쿼리keyword 는 정의상 단일 토큰 인 필드 에서만 작동합니다 . 필드 내용이 두 단어 이상인 것과는 관련이 없습니다. 와일드 카드 쿼리에서 "ozzy hello"가 일치합니다.
Monica와 Sox
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.