質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
Elasticsearch

Elasticsearchは、クラウド向けに構築された、RESTful な API を提供する分散型のサーチエンジンアプリケーションです。

Q&A

解決済

1回答

3369閲覧

ElasticSearch: Synonymを用いたsearchの方法

kinokawa

総合スコア11

Elasticsearch

Elasticsearchは、クラウド向けに構築された、RESTful な API を提供する分散型のサーチエンジンアプリケーションです。

1グッド

0クリップ

投稿2017/04/23 06:47

編集2017/04/23 06:50

###前提・実現したいこと
環境:CentOS6.5, Elasticsearch2.4.4
synonymを用いた検索を試みています。
_analyzeにおいてsynonymの動作を確認できたものの、
_searchにおいて、検索結果にsynonymが反映されず、検索score値が上がらないという問題に悩んでいます。
原因がお分かりになる方がいらっしゃいましたらお知恵を拝借させてください。

###動作確認済の範囲

# synonym辞書の中身 hattoriという文字列とyamatoという文字列をsynonymとして指定しています。 % cat /etc/elasticsearch/synonym.txt hattori,yamato # index(syn4)に対するanalyzer設定、サンプルデータ投入、setting確認 % curl -XPUT 'localhost:9200/syn4' -d ' { "settings": { "analysis": { "analyzer": { "synonym" : { "tokenizer" : "whitespace", "filter" : ["synonym"] } }, "filter" : { "synonym" : { "type" : "synonym", "synonyms_path" : "synonym.txt" } } } } } ' #データ投入 % curl -XPUT 'localhost:9200/syn4/blog/1' -d ' { "title": "self introduction", "content": "my name is yamato" } ' #setting確認 % curl -XGET http://localhost:9200/syn4/_settings?pretty { "syn4" : { "settings" : { "index" : { "creation_date" : "1492924084619", "analysis" : { "filter" : { "synonym" : { "type" : "synonym", "synonyms_path" : "synonym.txt" } }, "analyzer" : { "synonym" : { "filter" : [ "synonym" ], "tokenizer" : "whitespace" } } }, "number_of_shards" : "5", "number_of_replicas" : "1", "uuid" : "sPeReqCiTdiQmn9y6egxxx", "version" : { "created" : "2040499" } } } } }

analyzeテスト
yamato,hattoriが両方とも見える

curl -XGET 'http://localhost:9200/syn4/_analyze?analyzer=synonym' -d 'hattori' {"tokens":[{"token":"hattori","start_offset":0,"end_offset":7,"type":"word","position":0},{"token":"yamato","start_offset":0,"end_offset":7,"type":"SYNONYM","position":0}]}

###【問題の生じる箇所】
検索実行したログが以下となります。
hattoriで検索した際、yamatoでの検索よりも検索スコアが著しく低い(0.009585157)です。
また、synonym辞書にない語、例えば"hatta"にした際、わずかにスコアが高くなる(0.01程度)ことを確認しています。

% curl -XGET 'localhost:9200/syn4/_search' -d ' { "query": { "query_string": { "fields": ["content"], "query": "yamato" } } } ' {"took":4,"timed_out":false,"_shards":{"total":5,"successful":5,"failed":0},"hits":{"total":1,"max_score":0.23218305,"hits":[{"_index":"syn4","_type":"blog","_id":"1","_score":0.23218305,"_source": { "title": "self introduction", "content": "my name is yamato" } }]}} % curl -XGET 'localhost:9200/syn4/_search' -d ' { "query": { "query_string": { "fields": ["content"], "query": "hattori" } } } ' {"took":14,"timed_out":false,"_shards":{"total":5,"successful":5,"failed":0},"hits":{"total":1,"max_score":0.009585157,"hits":[{"_index":"syn4","_type":"blog","_id":"1","_score":0.009585157,"_source": { "title": "self introduction", "content": "my name is yamato" } }]}}

試したこと

http://qiita.com/yamadagenki/items/15cd190dc4e0f1b3e3fa
を参考にanalyzerをquery内に指定した場合、元の"yamato"でもヒットできなくなりました。"hattori"も同様です。

% curl -XGET 'localhost:9200/syn4/_search' -d ' { "query": { "query_string": { "fields": ["content"], "query": "yamato", "analyzer": "synonym" } } } ' {"took":3,"timed_out":false,"_shards":{"total":5,"successful":5,"failed":0},"hits":{"total":0,"max_score":null,"hits":[]}}
usop👍を押しています

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

恐らくFilter名とanalyzer名が一緒なので、es側が判断できないんじゃないでしょうか。

投稿2017/04/24 09:43

lazhuward

総合スコア1294

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

kinokawa

2017/04/26 02:29

ご回答いただきありがとうございました。 filter名とanalyzer名を変更しただけでは意図通り動かなかったのですが、 (※データ投入時にうまく設定すれば可能なのかもしれません) analyzerにdefaultを設定していなかったことが問題だと判明しました。 解決の手がかりをいただき、ありがとうございました。 【解決法】 curl -XPUT 'localhost:9200/syn4' -d ' { "settings": { "analysis": { "analyzer": { "default":{ "tokenizer" : "whitespace", "filter" : ["synonym"] } }, "filter" : { "synonym" : { "type" : "synonym", "synonyms_path" : "synonym.txt" } } } } } ' テスト実行: (analyzerにanalyzerの"synonym"を指定せずにsynonym展開できることを確認できました) curl -XGET 'http://localhost:9200/syn4/_analyze?pretty' -d 'hattori' {"tokens":[{"token":"hattori","start_offset":0,"end_offset":7,"type":"word","position":0},{"token":"yamato","start_offset":0,"end_offset":7,"type":"SYNONYM","position":0}]}
lazhuward

2017/04/26 04:25

そうか。デフォルトアナライザでしたか。 default(or default_index or default_search)がないから、 インデクシングとサーチでデフォルトアナライザが反映されなかったんですね。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問