用語フィルターのみを使用した次のElastic Searchクエリがあります。私のクエリははるかに複雑ですが、ここで問題を表示しようとしています。
{
"filter": {
"term": {
"field": "update-time"
}
}
}
ハイフンで区切られた値をフィルターに渡すと、ゼロの結果が返されます。しかし、ハイフンなしの値なしで試してみると、結果が返されます。ここでハイフンが問題であるかどうかはわかりませんが、私のシナリオではそう信じています。
フィルタが結果を返すようにハイフンをエスケープする方法はありますか?私はLuceneフォーラムから読んだバックスラッシュでハイフンをエスケープしようとしましたが、助けにはなりませんでした。
また、このフィールドにGUID値を渡すと、ハイフンで囲まれ、中括弧で囲まれます-{ASD23-34SD-DFE1-42FWW}のように、小文字にする必要がありますアルファベット文字で、中括弧もエスケープする必要がありますか?
ありがとう
Elasticsearchの文字列フィールドのデフォルト設定である、あなたのフィールドが分析されると思います。その結果、インデックスを作成するとき、「更新時間」という1つの用語としてではなく、「更新」と「時間」という2つの用語としてインデックスが作成されます。そのため、用語検索でこの用語を見つけることができません。フィールドに常に完全に一致する必要がある値が常に含まれる場合、マッピングではそのようなフィールドを未分析として定義するのが最善です。これを行うには、新しいマッピングでインデックスを再作成します。
curl -XPUT http://localhost:9200/your-index -d '{
"mappings" : {
"your-type" : {
"properties" : {
"field" : { "type": "string", "index" : "not_analyzed" }
}
}
}
}'
curl -XPUT http://localhost:9200/your-index/your-type/1 -d '{
"field" : "update-time"
}'
curl -XPOST http://localhost:9200/your-index/your-type/_search -d'{
"filter": {
"term": {
"field": "update-time"
}
}
}'
また、このフィールドに基づいてレコードを検索する柔軟性が必要な場合は、このフィールドを分析し続け、代わりにテキストクエリを使用できます。
curl -XPOST http://localhost:9200/your-index/your-type/_search -d'{
"query": {
"text": {
"field": "update-time"
}
}
}'
フィールドが分析される場合、このレコードは、Wordの「更新」またはWordの「時間」だけを検索することでも見つかることに注意してください。
Elastic 6.1では、受け入れられた答えがうまくいきませんでした。 Elasticがデフォルトで文字列フィールドに提供する「キーワード」フィールドを使用して解決しました。
{
"filter": {
"term": {
"field.keyword": "update-time"
}
}
}
@ imotov の回答に基づいて spring-data-elasticsearch を使用している場合、必要なことはフィールドに次のようにマークするだけです:
@Field(type = FieldType.String, index = FieldIndex.not_analyzed)
の代わりに
@Field(type = FieldType.String)
問題は、インデックスを削除し、新しいマッピングで再インスタンス化する必要があることです。