0

私のユースケースでは、末尾のワイルドカードを使用してエラスティック検索ドメインを照会する必要があります。クエリでこのようなワイルドカードを処理するベスト プラクティスについて、ご意見をお聞かせください。

次の句を追加することは、クエリの良い方法だと思いますか?

"query" : { 
    "query_string" : { 
        "query" :   "attribute:postfix*",
        "analyze_wildcard" : true,
        "allow_leading_wildcard" : false,
        "use_dis_max" : false
    } 
}

重い操作であるため、先頭のワイルドカードを許可しませんでした。ただし、長期的には、すべてのクエリ要求に対してワイルドカードを分析することがどれほど優れているかを知りたいと思っていました。私の理解では、クエリに実際にワイルドカードが含まれていない場合、ワイルドカードを分析しても影響はありません。あれは正しいですか?

4

1 に答える 1

2

マッピング タイプとインデックス設定を変更する可能性がある場合、適切な方法は、フィールドのすべてのプレフィックスをインデックス化するedge-n-gram トークン フィルターを使用してカスタム アナライザーを作成することです。attribute

curl -XPUT http://localhost:9200/your_index -d '{
    "settings": {
        "analysis": {
            "filter": {
                "edge_filter": {
                    "type": "edgeNGram",
                    "min_gram": 1,
                    "max_gram": 15
                }
            },
            "analyzer": {
                "attr_analyzer": {
                    "type": "custom",
                    "tokenizer": "standard",
                    "filter": ["lowercase", "edge_filter"]
                }
            }
        }
    },
    "mappings": {
        "your_type": {
            "properties": {
                "attribute": {
                    "type": "string",
                    "analyzer": "attr_analyzer",
                    "search_analyzer": "standard"
                }
            }
        }
    }
}'

次に、ドキュメントをインデックス化すると、attributeフィールド値 (例)postfixingは次のトークンとしてインデックス化されます: ppopospostpostfpostfipostfixpostfixipostfixinpostfixing

最後に、このような単純なクエリを使用して、値のattributeフィールドを簡単にクエリできます。クエリ文字列クエリでパフォーマンスの低いワイルドカードを使用する必要はありません。postfixmatch

{
  "query": {
     "match" : {
        "attribute" : "postfix"
     }
  }
}
于 2016-04-19T03:12:28.187 に答える