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 で打てば
厳密に検索できる.
Reference
이 문제에 관하여(Elastic Search アルファベットの大文字小文字を区別する検索と区別しない検索を実装する), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://dev.to/kaede_io/elastic-search-aruhuabetutonoda-wen-zi-xiao-wen-zi-woqu-bie-surujian-suo-toqu-bie-sinaijian-suo-woshi-zhuang-suru-c34텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)