アゴ乗せ日記

適当なポジティブ日記

スポンサーリンク

Amazon Elasticsearchで文字列中のスペースや中点など特定文字を除外して登録/検索する方法

若手アニキ、「ラ・ラ・ランド」で登録したデータを「ララランド」で検索してもHITしないです

ワイまかせな(ドヤ)


文字列中にスペースや中点など特定文字が含まれる場合、何もせずにアナライズかけると上記のように検索に引っかからない。

その様な場合は特定文字を除外して正規化するのが早いかもしれない。

タイトルや会社名などのフィールドに有効だ。

例えば「ラ・ラ・ランド」から中点を除外して「ララランド」として登録する。 検索時も同様に中点が含まれていたら除外して統一させることによって、検索にひっかけることができる。

どうやるか

char_filterで対応できる。

{
  "settings": {
    "index": {
      "analysis": {
        "analyzer": {
          "default_analyzer": {
            "tokenizer": "kuromoji_tokenizer",
            "char_filter": [
              "icu_normalizer"
            ]
          },
          "ore_no_analyzer": {
            "tokenizer": "kuromoji_tokenizer",
            "char_filter": [
              "ore_no_char_filter",
              "icu_normalizer"
            ]
          }
        },
        "char_filter": {
          "ore_no_char_filter": {
            "type": "mapping",
            "mappings": [
              "\\u0020=>",
              "\\u30FB=>",
              "\\u3000=>"
            ]
          }
        }
      }
    }
  }
}

analyzerブロック

default_analyzerとは別にore_no_analyzerを追加した。
char_filterに新規作成するore_no_char_filterを設定する。
また、全半角大小文字も統一させた方が実用的なのでicu_normalizerも設定しておく。

char_filterブロック

ore_no_char_filterを新規に作成する。 mappingsで文字の置換を定義している。

"mappings": [
  "\\u0020=>",
  "\\u30FB=>",
  "\\u3000=>"
]

unicodeで上から 『 』(半角スペース)、『・』(中点)、『 』(全角スペース)を 空文字に置換している(要は除外)。 unicodeはこちらから確認できる

除外とか置換したい文字はここに定義すればOK。

動作確認

まずはデフォルト設定

ちなみにこの画面はKibanaのDevtool画面。 default_analyzerだと文字列が分割されて認識されてしまう。

f:id:agonosetaro:20200220103519p:plain

char_filterを設定した結果

アナライザをore_no_analyzerに指定すると『ラ・ラ・ランド』が『ララランド』として登録される。もちろん検索時に『ラ・ラ・ランド』、『ララランド』どちらがきてもchar_filterで『ララランド』に統一されるため検索にひっかかるようになる。

f:id:agonosetaro:20200220103750p:plain

おわり

明日はブログを開設してちょうど1ヶ月が経つので振り返り記事をあげ...れるかわからんけど頑張る。

以上!!

スポンサーリンク