用于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示例,您是否有机会了解它??