elasticsearch 多条件查询 must
实际开发中,基本都是组合多条件查询
elasticsearch使用bool来实现这种需求
主要参数:
must
文档 必须 匹配这些条件才能被包含进来。
must_not
文档 必须不 匹配这些条件才能被包含进来。
should
如果满足这些语句中的任意语句,将增加 _score ,否则,无任何影响。它们主要用于修正每个文档的相关性得分。
filter
必须 匹配,但它以不评分、过滤模式来进行。这些语句对评分没有贡献,只是根据过滤标准来排除或包含文档。
单个条件 must 方式1 restful api
使用bool
POST http://192.168.199.126:9200/film/dongzuo/_search/
{
"query": {
"bool": {
"must": {
"match": {
"title": "星球"
}
}
}
}
}

多条件 must方式1 restful api
同时匹配多个条件 使用bool 包含多个条件即可
POST http://192.168.199.126:9200/film/dongzuo/_search/
{
"query": {
"bool": {
"must": [
{
"match": {
"title": "星球"
}
},
{
"match": {
"content": "战"
}
}
]
}
}
}

多条件查询方式2 Java接口实现
多个条件需要创建多个QueryBuilder对象 言外之意 如果只有一个条件 只需要创建一个QueryBuilder对象即可
部分代码
private TransportClient client;
private static String host="192.168.199.126";
private static int port=9300; // 程序连接的端口
// 配置settings 集群相关
private static Settings.Builder settings = Settings.builder().put("cluster.name","my-application");
@Before
public void init() throws UnknownHostException {
client = new PreBuiltTransportClient(settings.build())
.addTransportAddress(new TransportAddress(InetAddress.getByName(host), port));
}
@After
public void close(){
if(client!=null){
client.close();
}
}
/**
* 多条件查询 must
* @throws Exception
*/
@Test
public void searchMutil()throws Exception{
SearchRequestBuilder srb=client.prepareSearch("film").setTypes("dongzuo");
// 封装查询条件 matchPhraseQuery定义短语/短词汇
QueryBuilder queryBuilder=QueryBuilders.matchPhraseQuery("title", "战");
QueryBuilder queryBuilder2=QueryBuilders.matchPhraseQuery("content", "星球");
SearchResponse sr=srb.setQuery(QueryBuilders.boolQuery() // 多条件查询 使用QueryBuilders.boolQuery()
.must(queryBuilder) // 包含
.must(queryBuilder2))
.execute()
.actionGet();
SearchHits hits=sr.getHits();
for(SearchHit hit:hits){
System.out.println(hit.getSourceAsString());
}
}
