想象以下模式
{
"mappings": {
"my_mappinng": {
"dynamic": false,
"_all": { "enabled": false },
"_source": { "enabled": true },
"properties": {
"my_string": { "type": "string", "store": true, "index" : "not_analyzed" },
"my_boolean": { "type": "boolean", "store": true },
"my_long": { "type": "long", "store": true }
}
}
},
"settings" : {
"index" : {
"number_of_shards" : 9,
"number_of_replicas" : 1
}
}
}'
如果我想查询与 my_string
、 my_boolean
和 my_long
的精确字段匹配
是标准建议
BoolQueryBuilder query = QueryBuilders.boolQuery();
QueryBuilder my_filter = QueryBuilders.termQuery("my_string", "string_i_want_to_match");
query.should(my_filter);
BoolQueryBuilder query = QueryBuilders.boolQuery();
QueryBuilder my_filter = QueryBuilders.termQuery("my_boolean", true);
query.should(my_filter);
BoolQueryBuilder query = QueryBuilders.boolQuery();
QueryBuilder my_filter = QueryBuilders.termQuery("my_long", 1l);
query.should(my_filter);
而不是
BoolQueryBuilder query = QueryBuilders.boolQuery();
query.must(matchQuery("my_string", "string_i_want_to_match"));
BoolQueryBuilder query = QueryBuilders.boolQuery();
query.must(matchQuery("my_boolean", true));
BoolQueryBuilder query = QueryBuilders.boolQuery();
query.must(matchQuery("my_long", 1l));
这是正确的吗?
答案 0 :(得分:1)
看起来您使用的是旧版本的 ES,其中不支持关键字数据类型,因此在这种情况下您是正确的,但是如果您升级 ES 而不是定义 not_analyzed
(已弃用),您应该使用 { {1}} 数据类型,顾名思义不会更改 keyword
并创建与您应该使用的输入 text
和更高版本的 text
查询相同的令牌,用于精确匹配场景。
请注意,在最新版本的 ES 中,如果您不定义映射,则默认每个 term
字段,一个 text
字段用于全文搜索,一个 {{1} } 聚合字段,创建排序。
简而言之,您下面的 Java 代码适合您的用例。
text