クラウドでホストされているクラスターの 1 つにある ES インデックスをクエリする Java 高レベル REST クライアントを使用して、elasticsearch 検索機能を実装しています。私の意図したクエリ JSON DSL は次のようになります。
{
"query" :{
"bool": {
"should" :[
{
"query_string":{
"query":"cla-180",
"default_field": "product_title",
"boost" : 3
}
},
{
"match" : {
"product_title" : {
"query" : "cla-180",
"fuzziness" : "AUTO"
}
}
}
]
}
}
}
これに対応して、上記の DSL と同じ機能を実行する Java 高レベル REST クライアントを使用して実行するコードを作成しました。
BoolQueryBuilder boolQueryBuilder = buildBoolQuery();
boolQueryBuilder.should(QueryBuilders.queryStringQuery("cla-180").defaultField("product_title")).boost(3);
boolQueryBuilder.should(QueryBuilders.matchQuery("product_title", "cla-180").fuzziness(Fuzziness.AUTO));
SearchSourceBuilder sourceBuilder = new SearchSourceBuilder();
sourceBuilder.query(boolQueryBuilder);
私が気付いたのは、Java メソッドの検索結果が、kibana で DSL を直接実行した場合の結果と異なることです。Javaから実行すると、上記の検索内容と関係のないレコードが見つかります。上記の JSON クエリ DSL と一致するように Java コードを実装したと思うので、これは奇妙だと思います。
生成された JSON を Java 側から出力しようとすると、その出力は次のようになります。
{
"query": {
"bool" : {
"should" : [
{
"query_string" : {
"query" : "cla-180",
"default_field" : "product_title",
"fields" : [ ],
"type" : "best_fields",
"default_operator" : "or",
"max_determinized_states" : 10000,
"enable_position_increments" : true,
"fuzziness" : "AUTO",
"fuzzy_prefix_length" : 0,
"fuzzy_max_expansions" : 50,
"phrase_slop" : 0,
"escape" : false,
"auto_generate_synonyms_phrase_query" : true,
"fuzzy_transpositions" : true,
"boost" : 1.0
}
},
{
"match" : {
"product_title" : {
"query" : "cla-180",
"operator" : "OR",
"fuzziness" : "AUTO",
"prefix_length" : 0,
"max_expansions" : 50,
"fuzzy_transpositions" : true,
"lenient" : false,
"zero_terms_query" : "NONE",
"auto_generate_synonyms_phrase_query" : true,
"boost" : 1.0
}
}
}
],
"adjust_pure_negative" : true,
"minimum_should_match" : "1",
"boost" : 3.0
}
}
}
検索結果が望ましくない方法で返されるようにする Java コードに何か不足がありますか? または、これら 2 つのメソッドで返されるレコードの不一致の理由は何でしょうか?
前もって感謝します!