elasticsearch,Java,elasticsearch" /> elasticsearch,Java,elasticsearch" />

用于ElasticSearch多字段搜索的Java API

用于ElasticSearch多字段搜索的Java API,java,elasticsearch,Java,elasticsearch,在一个索引下,我的文档中有一些字段,比如name和location。 现在,用名称“Peter”和位置“Paris”搜索所有文档 我的Java代码是: SearchRequest searchRequest = new SearchRequest(indexName); SearchSourceBuilder builder = new SearchSourceBuilder().postFilter(QueryBuilders.termQuery("name", "

在一个索引下,我的文档中有一些字段,比如
name
location
。 现在,用
名称
“Peter”和
位置
“Paris”搜索所有文档

我的Java代码是:

SearchRequest searchRequest = new SearchRequest(indexName);
SearchSourceBuilder builder = new SearchSourceBuilder().postFilter(QueryBuilders.termQuery("name", "Peter")).postFilter(QueryBuilders.termQuery("location", "Paris"));

SearchResponse response = null;
    try {
        response = client.search(searchRequest, RequestOptions.DEFAULT);
    } catch (IOException e) {
        e.printStackTrace();
    }
上面的代码,并没有给我准确的结果。
有人能帮你找到正确的方法吗?

在JSON格式中,你的查询应该是这样的:

{
  "query": {
    "bool": {
      "must": [
        {
          "match": {
            "name": "Peter"
          }
        },
        {
          "match": {
            "location": "Paris"
          }
        }
      ]
    }
  }
}

您可以使用下面的代码,注意当前您使用的是on
text
字段,该字段不允许您进行不区分大小写的匹配,因为它未被分析,通常用于精确搜索

SearchRequest searchRequest = new SearchRequest("index-name");
        BoolQueryBuilder boolQueryBuilder = new BoolQueryBuilder();
        if (name != null) {
            MatchQueryBuilder nameMatchQueryBuilder = new MatchQueryBuilder("name", name); // replace name with `peter`
            boolQueryBuilder.should(nameMatchQueryBuilder); // change it to `must` if you want this result to be present.
        }
        if (location != null) {
            MatchQueryBuilder locationMatchQueryBuilder = new MatchQueryBuilder("location", location);
            boolQueryBuilder.should(locationMatchQueryBuilder);
        }
        SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();
        searchSourceBuilder.query(boolQueryBuilder);
        log.info("Search json {}", searchSourceBuilder.toString());
        searchRequest.source(searchSourceBuilder);
        SearchResponse searchResponse = esclient.search(searchRequest, RequestOptions.DEFAULT);

另外,请注意代码中的注释,因为您可以看到它生成了注释,因此如果您希望这两个术语都出现,请替换
boolQueryBuilder.should(nameMatchQueryBuilder)使用
boolQueryBuilder.must(nameMatchQueryBuilder)构造

谢谢您的回复。在Java API中我将如何做到这一点?我已经添加了Java API示例,您是否有机会了解它??