web-dev-qa-db-ja.com

用語フィルターに関するElastic Search Hyphenの問題

用語フィルターのみを使用した次のElastic Searchクエリがあります。私のクエリははるかに複雑ですが、ここで問題を表示しようとしています。

{
    "filter": {
            "term": {
                    "field": "update-time"
                }
        }
}

ハイフンで区切られた値をフィルターに渡すと、ゼロの結果が返されます。しかし、ハイフンなしの値なしで試してみると、結果が返されます。ここでハイフンが問題であるかどうかはわかりませんが、私のシナリオではそう信じています。

フィルタが結果を返すようにハイフンをエスケープする方法はありますか?私はLuceneフォーラムから読んだバックスラッシュでハイフンをエスケープしようとしましたが、助けにはなりませんでした。

また、このフィールドにGUID値を渡すと、ハイフンで囲まれ、中括弧で囲まれます-{ASD23-34SD-DFE1-42FWW}のように、小文字にする必要がありますアルファベット文字で、中括弧もエスケープする必要がありますか?

ありがとう

48
Gabbar

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の「時間」だけを検索することでも見つかることに注意してください。

82
imotov

Elastic 6.1では、受け入れられた答えがうまくいきませんでした。 Elasticがデフォルトで文字列フィールドに提供する「キーワード」フィールドを使用して解決しました。

{
    "filter": {
            "term": {
                    "field.keyword": "update-time"
                }
        }
}
9
I.devries

@ imotov の回答に基づいて spring-data-elasticsearch を使用している場合、必要なことはフィールドに次のようにマークするだけです:

@Field(type = FieldType.String, index = FieldIndex.not_analyzed)

の代わりに

@Field(type = FieldType.String)

問題は、インデックスを削除し、新しいマッピングで再インスタンス化する必要があることです。

1
Innokenty