Elasticsearch 용어와 일치

Sep 01 2020

2 가지 조건으로 검색어를 작성해야합니다.

  1. 타임 스탬프
  2. 예배 규칙서

아래와 같이 검색 쿼리에서 일치를 사용할 때

{
   "query":{
      "bool":{
         "must":{
            "match":{
               "directory":"/user/ayush/test/error/"
            }
         },
         "filter":{
            "range":{
               "@timestamp":{
                  "gte":"2020-08-25 01:00:00",
                  "lte":"2020-08-25 01:30:00",
                  "format":"yyyy-MM-dd HH:mm:ss"
               }
            }
         }
      }
   }
}

필터 결과에서 디렉토리와 함께 레코드를 얻고 있습니다.

  1. /user/ayush/test/error/
  2. /user/hive/
  3. /user/

하지만 아래와 같은 용어를 사용하면

{
   "query":{
      "bool":{
         "must":{
            "term":{
               "directory":"/user/ayush/test/error/"
            }
         },
         "filter":{
            "range":{
               "@timestamp":{
                  "gte":"2020-08-25 01:00:00",
                  "lte":"2020-08-25 01:30:00",
                  "format":"yyyy-MM-dd HH:mm:ss"
               }
            }
         }
      }
   }
}

디렉토리 값으로도 결과가 나오지 않습니다. /user/ayush/test/error/

답변

1 ESCoder Sep 01 2020 at 15:43

일치 쿼리는 입력 문자열을 분석하고 그로부터 더 기본적인 쿼리를 구성합니다.

검색어는 정확한 검색어와 일치합니다.

자세한 정보를 얻으려면 다음 블로그를 참조하십시오.

그래서 용어 대 일치 쿼리에 대한 질문

https://discuss.elastic.co/t/term-query-vs-match-query/14455

elasticsearch 일치 대 용어 쿼리

필드 값 /user/ayush/test/error/은 다음과 같이 분석됩니다.

POST/_analyze
{
  "analyzer" : "standard",
  "text" : "/user/ayush/test/error/"
}

생성 된 토큰은 다음과 같습니다.

{
    "tokens": [
        {
            "token": "user",
            "start_offset": 1,
            "end_offset": 5,
            "type": "<ALPHANUM>",
            "position": 0
        },
        {
            "token": "ayush",
            "start_offset": 6,
            "end_offset": 11,
            "type": "<ALPHANUM>",
            "position": 1
        },
        {
            "token": "test",
            "start_offset": 12,
            "end_offset": 16,
            "type": "<ALPHANUM>",
            "position": 2
        },
        {
            "token": "error",
            "start_offset": 17,
            "end_offset": 22,
            "type": "<ALPHANUM>",
            "position": 3
        }
    ]
}

인덱스 데이터 :

{ "directory":"/user/ayush/test/error/" }
{ "directory":"/user/ayush/" }
{ "directory":"/user" }

검색어를 사용한 검색어 :

용어 쿼리는 검색 용어에 분석기를 적용하지 않으므로 반전 된 인덱스에서 정확한 용어 만 찾습니다. 따라서 정확한 용어를 검색 directory.keyword하려면 필드 매핑 을 사용하거나 변경 해야 합니다.

{
  "query": {
    "term": {
      "directory.keyword": {
        "value": "/user/ayush/test/error/",
        "boost": 1.0
      }
    }
  }
}

검색어에 대한 검색 결과 :

"hits": [
            {
                "_index": "my_index",
                "_type": "_doc",
                "_id": "1",
                "_score": 0.9808291,
                "_source": {
                    "directory": "/user/ayush/test/error/"
                }
            }
        ]