匹配查询与匹配精确字段中的术语查询

时间:2021-02-05 19:38:59

标签: java elasticsearch

想象以下模式

  {
    "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_stringmy_booleanmy_long 的精确字段匹配

是标准建议

  1. 将字符串字段设置为“not_analyzed”以使其不被标记
  2. 使用词条查询代替匹配查询
           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));

这是正确的吗?

1 个答案:

答案 0 :(得分:1)

看起来您使用的是旧版本的 ES,其中不支持关键字数据类型,因此在这种情况下您是正确的,但是如果您升级 ES 而不是定义 not_analyzed(已弃用),您应该使用 { {1}} 数据类型,顾名思义不会更改 keyword 并创建与您应该使用的输入 text 和更高版本的 text 查询相同的令牌,用于精确匹配场景。

请注意,在最新版本的 ES 中,如果您不定义映射,则默认每个 term 字段,一个 text 字段用于全文搜索,一个 {{1} } 聚合字段,创建排序。

简而言之,您下面的 Java 代码适合您的用例。

text