Elastic Search 1.6
ハイフンを含むテキスト(U-12、U-17、WU-12、Tシャツなど)にインデックスを付け、「SimpleQueryString」クエリを使用してそれらを検索できるようにしたい。
データサンプル(簡略化):
{"title":"U-12 Soccer",
"comment": "the t-shirts are dirty"}
ハイフンについてはすでにかなり多くの質問があるので、私はすでに次の解決策を試しました。
Charフィルターを使用します: ElasticSearch-名前にハイフンを使用して検索 。
だから私はこのマッピングに行きました:
{
"settings":{
"analysis":{
"char_filter":{
"myHyphenRemoval":{
"type":"mapping",
"mappings":[
"-=>"
]
}
},
"analyzer":{
"default":{
"type":"custom",
"char_filter": [ "myHyphenRemoval" ],
"tokenizer":"standard",
"filter":[
"standard",
"lowercase"
]
}
}
}
},
"mappings":{
"test":{
"properties":{
"title":{
"type":"string"
},
"comment":{
"type":"string"
}
}
}
}
}
検索は次のクエリで実行されます。
{"_source":true,
"query":{
"simple_query_string":{
"query":"<Text>",
"default_operator":"AND"
}
}
}
何が機能するか:
「U-12」、「U *」、「t *」、「ts *」
うまくいかなかったもの:
「U-*」、「u-1 *」、「t- *」、「t-sh *」、.。
それで、charフィルターは検索文字列で実行されていないようですか?これを機能させるために何ができますか?
答えは本当に簡単です:
Igor Motovからの引用: 標準トークナイザーの構成
デフォルトでは、simple_query_stringクエリはワイルドカードを含む単語を分析しません。その結果、i-maで始まるすべてのトークンを検索します。 Word i-macは、分析中に2つのトークンiとmacに分割され、これらのトークンはどちらもi-maで始まらないため、この要求と一致しません。このクエリでi-macを検索するには、ワイルドカードを分析する必要があります。
{
"_source":true,
"query":{
"simple_query_string":{
"query":"u-1*",
"analyze_wildcard":true,
"default_operator":"AND"
}
}
}
この問題の簡単な回避策をまだ探している人がいる場合は、データのインデックスを作成するときにハイフンをアンダースコア_
に置き換えてください。
たとえば、O-000022334はO_000022334としてインデックス付けする必要があります。
検索するときは、結果を表示するときにアンダースコアをハイフンに戻します。このようにして「O-000022334」を検索すると、正しい一致が見つかります。
igor Motovからの引用は真です。正規表現で機能させるには、「analyze_wildcard」:trueを追加する必要があります。ただし、ハイフンは実際には「u」「12」の「u-12」を2つの別々の単語でトークン化することに注意することが重要です。
オリジナルを保持することが重要な場合は、マッピング文字フィルターを使用しないでください。それ以外の場合は、一種の便利です。
「m0-77」、「m1-77」、「m2-77」があると想像してください。m* -77を検索すると、ヒット数はゼロになります。ただし、「-」(ハイフン)をANDに置き換えて、2つの分離された単語を接続し、m * AND77を検索して正しいヒットを得ることができます。
クライアントフロントでそれを行うことができます。
あなたの問題ではu- *
{
"query":{
"simple_query_string":{
"query":"u AND 1*",
"analyze_wildcard":true
}
}
}
t-sh *
{
"query":{
"simple_query_string":{
"query":"t AND sh*",
"analyze_wildcard":true
}
}
}