Elastic Search アルファベットの大文字小文字を区別する検索と区別しない検索を実装する

12987 단어 elasticsearch



日本語の部分一致検索をしたかった.

https://www.elastic.co/guide/en/elasticsearch/reference/current/multi-fields.html

ES の公式gaidを見ると

PUT indexName
{
  "mappings": {
    "properties": {
      "keyName": {
        "type": "text",
        "fields": {
          "raw": { 
            "type":  "keyword"
          }
        }
      }
    }
  }
}


その index の mapping を PUT で更新すれば良いようだ.
fileds の raw の type を 키워드 にすれば
少文字大文字で区別せずに検索できるようになるらしい?

実際に自分のインデックスに打って確かめてみる



これを打つと text の raw の 中身 が 키워드 で作られた.

{
  "error": {
    "root_cause": [
      {
        "type": "illegal_argument_exception",
        "reason": "mapper [name] cannot be changed from type [text] to [keyword]"
      }
    ],
    "type": "illegal_argument_exception",
    "reason": "mapper [name] cannot be changed from type [text] to [keyword]"
  },
  "status": 400
}


PUT だから本體의 텍스트를 키워드 に変更しようとしてみたが
変更できないとエラーがでた.

        "type": "illegal_argument_exception",
        "reason": "mapper [name.raw] cannot be changed from type [keyword] to [text]"


中の생이라고 하는 키워드도
PUT 으로 텍스트 <-> 키워드 に変更することはできなかった.

{
  "acknowledged": true
}


同じ値でrikestすると「知ってるよ」って레스폰스가来る.
よって, クエリを間違えているわけではなさそうだ.

raw について調べてみる



https://stackoverflow.com/a/38538096

도시: New York の場合は
new と york のトークンが city 피르드니入っている
city.raw のフィールドには New York の完全なキーwordが入っている.
こういうことらしい.

dan に DaN でrikestしてみる.



親である text の dan の データにrichestしてみる

GET /customer/_search
{
  "query": {
      "match": { "name": "DaN" } 
    }
  }
}


前回作った dan の データが

    "hits": [
      {
        "_index": "customer",
        "_id": "3",
        "_score": 0.9808291,
        "_source": {
          "name": "dan"
        }
      }
    ]


DaN の検索でヒットした.

https://www.elastic.co/guide/en/elasticsearch/reference/current/mapping-types.html#text-search-types

既にデフォルトの text 型なら 大文字小文字区別なくひっかかる?

da では引っからない.

https://www.elastic.co/guide/en/elasticsearch/reference/current/keyword.html#keyword

反対에 키워드형은
  • 아이디
  • 호스트 주소
  • 상태 코드
  • 우편번호

  • こういう形式の決まっている値に向いているっぽい.

    https://qiita.com/mctk/items/0a072e758811d90d4642#elasticsearch%E3%81%A7%E3%81%AE%E5%AE%9F%E8%A3%85%E6%96%B9%E6%B3%95

    키워드 は単語で分割して保存されないので、match で部分一致検索できないらしい.


    키워드 型で検索する



    https://stackoverflow.com/questions/41722812/elasticsearch-can-i-query-the-raw-field

    これを読むと、raw を検索するには re-index をしないといけないが
    クエリはあっているらしい.

    GET /customer/_search
    {
      "query": {
          "match": { "name.keyword": "dan" } 
        }
      }
    }
    



        "hits": [
          {
            "_index": "customer",
            "_id": "3",
            "_score": 0.9808291,
            "_source": {
              "name": "dan"
            }
          }
        ]
    


    なので、中身の 키워드 に dan でかけると取れて

    GET /customer/_search
    {
      "query": {
          "match": { "name.keyword": "dAn" } 
        }
      }
    }
    



        "hits": []
    


    d でかけると取れなかった.


    まとめ



    탄력적 검색 の 인덱스 に対して 키 값 のsettを追加する と、
    デフォルトでは text 型で保存される.

    text 型は単語で分割して保存されるので、__검색 일치 を打つだけで
    アルファベットでは、大文字小文字の曖昧検索が実装できる.

    一方、大文字小文字を厳密に検索したい場合は、

    GET /customer/_search
    {
      "query": {
          "match": { "name.keyword": "dan" } 
        }
      }
    }
    


    このように keyName.keyword で打てば
    厳密に検索できる.

    좋은 웹페이지 즐겨찾기