Skip to content

Commit

Permalink
Update 2024-11-29-貧乏企業名サジェスト機能開発.md
Browse files Browse the repository at this point in the history
  • Loading branch information
tubone24 authored Dec 3, 2024
1 parent cdb4666 commit c77b57b
Showing 1 changed file with 12 additions and 17 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -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が入る構成です。
Expand All @@ -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
- 手作りのマッピングでおもに企業名のふりがな検索に利用
Expand All @@ -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) |
|------------|--------------|---------------------------|
Expand All @@ -522,9 +518,9 @@ ngramは、最小文字数2、最大文字数3で設定してます。これは
## インデックスの読み取り専用化
今回はフロントエンドからElasticsearchを直接叩く構成になっているため、いたずらされてインデックスが消されたり変更されたりする可能性があります
今回はフロントエンドからElasticsearchを直接叩く構成になっているため、エンドポイントを解読してElasticsearchがバックエンドとわかれば、**いたずらされてインデックスが消されたり変更されたりする可能性**があります
そこでインデックスを読み取り専用にしておきます
そこで**インデックスを読み取り専用**にしておきます
```python
from elasticsearch import Elasticsearch
Expand All @@ -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つのフィールドに対して検索を行います
### 検索手法の組み合わせ
Expand All @@ -555,20 +550,20 @@ 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"
}
}
```
2. 前方一致検索
会社名、ひらがな名、カタカナ名それぞれに対してmatch_phrase_prefixを使用し、最大10件まで展開します。
会社名、ひらがな名それぞれに対してmatch_phrase_prefixを使用し、最大10件まで展開します。
3. 完全一致優先
company_name.keywordに対する前方一致検索を追加し、完全一致に近い結果を優先的に表示します。
また、完全一致に近い結果にはboost: 3を設定、ひらがな・カタカナ検索にはboost: 2を設定してます。
また、完全一致に近い結果にはboost: 3を設定、ひらがな検索にはboost: 2を設定してます。
これにより、より適切な検索結果の順序付けを実現しています。
Expand Down

0 comments on commit c77b57b

Please sign in to comment.