diff --git "a/src/content/2024-11-29-\350\262\247\344\271\217\344\274\201\346\245\255\345\220\215\343\202\265\343\202\270\343\202\247\343\202\271\343\203\210\346\251\237\350\203\275\351\226\213\347\231\272.md" "b/src/content/2024-11-29-\350\262\247\344\271\217\344\274\201\346\245\255\345\220\215\343\202\265\343\202\270\343\202\247\343\202\271\343\203\210\346\251\237\350\203\275\351\226\213\347\231\272.md" index f76d8ef72c..1a8a9dca5a 100644 --- "a/src/content/2024-11-29-\350\262\247\344\271\217\344\274\201\346\245\255\345\220\215\343\202\265\343\202\270\343\202\247\343\202\271\343\203\210\346\251\237\350\203\275\351\226\213\347\231\272.md" +++ "b/src/content/2024-11-29-\350\262\247\344\271\217\344\274\201\346\245\255\345\220\215\343\202\265\343\202\270\343\202\247\343\202\271\343\203\210\346\251\237\350\203\275\351\226\213\347\231\272.md" @@ -471,13 +471,7 @@ if es.indices.exists(index="companies"): 補足的な話ですが簡単にElasticsearchのフィルター処理の簡単な流れを図示します。 -``` -graph TD - A[入力テキスト: 株式会社テスト開発] --> B[Character Filter] - B --> C[Tokenizer] - C --> D[Token Filter] - D --> E[インデックス登録] -``` +![](https://i.imgur.com/Nuvz5Ik.png) このように最初にCharacter Filter、そのあとにTokenizerが入り最後にToken Filterが入る構成です。 @@ -490,11 +484,13 @@ graph TD - N-gram - Edge N-gram -kuromojiでは日本語の形態素解析に合わせて分割するいわゆるよくあるテッパンの日本語全文検索の構成です。こちらをベースのアナライザーとしつつ、加えてN-gram、Edge N-gramのアナライザーを使って前方一致のサジェストおよびあいまい検索を実現してます。 +kuromojiでは日本語の形態素解析に合わせて分割するいわゆるよくあるテッパンの日本語全文検索の構成です。 + +こちらをベースのアナライザーとしつつ、加えてN-gram、Edge N-gramのアナライザーを使って前方一致のサジェストおよびあいまい検索を実現してます。 #### 独自に作ったChar filter -ICU normalizerなどのプラグインのほか、独自で入れているChar filterがあります。 +ICU normalizerなどのプラグインのほか、今回のために独自で作成しているChar filterがあります。 - kana_converter - 手作りのマッピングでおもに企業名のふりがな検索に利用 @@ -513,7 +509,7 @@ ICU normalizerなどのプラグインのほか、独自で入れているChar f それぞれのtokenizerの設定は次のとおりです。 ngramは、最小文字数2、最大文字数3で設定してます。これはあいまい検索のためにできるだけ単語を分割したほうが引っかかりやすいためです。 -一方で、Edge ngramでは最大文字数を15まで拡大してます。これは前方一致の検索が次々と文章が打たれるたびに検索が一致で絞り込まれるようにするためです。 +一方で、Edge ngramでは最大文字数を**15**まで拡大してます。これは前方一致の検索が次々と文章が打たれるたびに検索が一致で絞り込まれるようにするためです。 | 入力テキスト | N-gram (n=2) | Edge N-gram (min=1, max=15) | |------------|--------------|---------------------------| @@ -522,9 +518,9 @@ ngramは、最小文字数2、最大文字数3で設定してます。これは ## インデックスの読み取り専用化 -今回はフロントエンドからElasticsearchを直接叩く構成になっているため、いたずらされてインデックスが消されたり変更されたりする可能性があります。 +今回はフロントエンドからElasticsearchを直接叩く構成になっているため、エンドポイントを解読してElasticsearchがバックエンドとわかれば、**いたずらされてインデックスが消されたり変更されたりする可能性**があります。 -そこでインデックスを読み取り専用にしておきます。 +そこで**インデックスを読み取り専用**にしておきます。 ```python from elasticsearch import Elasticsearch @@ -544,9 +540,8 @@ response = es.indices.put_settings(index="companies", body=settings_body) - company_name (通常の会社名) - company_name.ngram (N-gram解析された会社名) - hiragana_name (ひらがな) - - katakana_name (カタカナ) -の4つのフィールドに対して検索を行います。 +の3つのフィールドに対して検索を行います。 ### 検索手法の組み合わせ @@ -555,7 +550,7 @@ response = es.indices.put_settings(index="companies", body=settings_body) { "multi_match": { "query": query, - "fields": ["company_name", "company_name.ngram", "hiragana_name", "katakana_name"], + "fields": ["company_name", "company_name.ngram", "hiragana_name"], "type": "cross_fields", "operator": "and" } @@ -563,12 +558,12 @@ response = es.indices.put_settings(index="companies", body=settings_body) ``` 2. 前方一致検索 -会社名、ひらがな名、カタカナ名それぞれに対してmatch_phrase_prefixを使用し、最大10件まで展開します。 +会社名、ひらがな名それぞれに対してmatch_phrase_prefixを使用し、最大10件まで展開します。 3. 完全一致優先 company_name.keywordに対する前方一致検索を追加し、完全一致に近い結果を優先的に表示します。 -また、完全一致に近い結果にはboost: 3を設定、ひらがな・カタカナ検索にはboost: 2を設定してます。 +また、完全一致に近い結果にはboost: 3を設定、ひらがな検索にはboost: 2を設定してます。 これにより、より適切な検索結果の順序付けを実現しています。