57

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

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

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

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

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

ありがとう

4

3 に答える 3

89

あなたのフィールドが分​​析されていると思います。これはelasticsearchの文字列フィールドのデフォルト設定です。その結果、インデックスを作成すると、「update-time」という1つの用語としてではなく、「update」と「time」という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"
        }
    }
}'

フィールドを分析すると、このレコードは「update」または「time」という単語だけを検索しても見つかることに注意してください。

于 2012-07-19T18:38:25.050 に答える
38

受け入れられた答えは、elastic6.1では機能しませんでした。私は、elasticが文字列フィールドにデフォルトで提供する「キーワード」フィールドを使用してそれを解決しました。

{
    "filter": {
            "term": {
                    "field.keyword": "update-time"
                }
        }
}
于 2018-01-29T14:09:03.003 に答える
1

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

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

それ以外の

@Field(type = FieldType.String)

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

于 2016-09-14T11:13:37.553 に答える