Elasticsearch 정확히 일치 쿼리 (퍼지 아님)

Nov 24 2020

문자열 필드에 대해 다음 쿼리가 있습니다.

const query = {
        "query": {
          "match_phrase": {
            name:  "ron"
          }
        },
        "from": 0,
        "size": 10
      };

이것이 제가 데이터베이스에있는 이름입니다.

1. "ron"
2. "ron martin"
3. "ron ron"
4. "ron howard"

이 쿼리의 결과는 매우 모호하며 행 번호 1 만 반환되는 대신 모든 행이 반환됩니다. "같음"대신 "포함"을 수행하는 것과 같습니다.

감사

답변

1 ESCoder Nov 24 2020 at 15:08

귀하의 경우 모든 문서가 포함 ron되어 있기 때문에 모든 문서가 반환 됩니다.

정확한 필드 만 일치 keyword하도록하려면 name필드 에 하위 필드를 추가해야 합니다. 이것은 표준 분석기 대신 키워드 분석기를 사용합니다 ( ".keyword"뒤 name필드에주의). 아래 쿼리를 시도해보십시오.

인덱스 매핑 :

{
  "mappings": {
    "properties": {
      "name": {
        "type": "text",
        "fields": {
          "keyword": {
            "type": "keyword",
            "ignore_above": 256
          }
        }
      }
    }
  }
}

인덱스 데이터 :

{
    "name":"ron"
}
{
    "name":"ron martin"
}
{
    "name":"ron ron"
}
{
    "name":"ron howard"
}
{
    "name": "john howard"
}

검색어:

{
  "query": {
    "match_phrase": {
      "name.keyword": "ron"
    }
  },
  "from": 0,
  "size": 10
}

검색 결과:

"hits": [
      {
        "_index": "64982377",
        "_type": "_doc",
        "_id": "1",
        "_score": 1.2039728,
        "_source": {
          "name": "ron"
        }
      }
    ]

업데이트 1 :

아래 설명에 따라 요구 사항에 따라 정확히 일치와 유사 일치를 모두 검색하려면 multi_match query를 사용할 수 있습니다 .

검색어:

{
  "query": {
    "multi_match": {
      "query": "howard",
      "fields": [
        "name",
        "name.keyword"
      ],
      "type": "phrase"
    }
  }
}

검색 결과:

"hits": [
      {
        "_index": "64982377",
        "_type": "_doc",
        "_id": "4",
        "_score": 0.83740485,
        "_source": {
          "name": "ron howard"
        }
      },
      {
        "_index": "64982377",
        "_type": "_doc",
        "_id": "5",
        "_score": 0.83740485,
        "_source": {
          "name": "john howard"
        }
      }
    ]