ElasticSearch 组合查询(must not

xiaoxiao2025-07-24  38

ElasticSearch 组合查询(must not_must should filter)

ElasticSearch Demo:

package org.ssgroup; import java.io.IOException; import java.net.InetAddress; import org.elasticsearch.action.search.SearchResponse; import org.elasticsearch.client.transport.TransportClient; import org.elasticsearch.common.settings.Settings; import org.elasticsearch.common.transport.TransportAddress; import org.elasticsearch.index.query.QueryBuilders; import org.elasticsearch.search.SearchHit; import org.elasticsearch.search.SearchHits; import org.elasticsearch.transport.client.PreBuiltTransportClient; public class ElasticSearchMultiQuery { private static String ES_HOST1 = "192.168.10.252"; private static String ES_HOST2 = "192.168.10.254"; private static String ES_HOST3 = "192.168.10.255"; private static int ES_PORT = 9300; /** * 实际开发中,基本都是组合多条件查询 * elasticsearch提供Boolean来实现这种需求 * 主要参数: * must:文档必须匹配这些条件才能被包含进来。 * must_not:文档必须不匹配这些条件才能被包含就来。 * should:如果满足这些语句中的任意语句,将增加_score,否则无任何影响, * 主要用于修正每个文档的相关性得分。 * filter:必须匹配,但他以不评分、过滤模式来进行,这些语句对评分没有贡献, * 只是根据过滤标准来排除或包含文档。 * @param args * @throws IOException */ public static void main(String[] args) throws IOException { Settings settings = Settings.builder() .put("cluster.name", "my-application").build(); TransportClient client = new PreBuiltTransportClient(settings) .addTransportAddress(new TransportAddress(InetAddress.getByName(ES_HOST1), ES_PORT)) .addTransportAddress(new TransportAddress(InetAddress.getByName(ES_HOST2), ES_PORT)) .addTransportAddress(new TransportAddress(InetAddress.getByName(ES_HOST3), ES_PORT)); //多条件查询(即包含... 并且包含...) must and must //multiSearchMust(client); //多条件查询(即包含... 并且不包含...) must and must_not //multiSearchMustNot(client); //多条件查询(加权显示) //multiSearchShould(client); //多条件查询(过滤) multiSearchFilter(client); client.close(); } /** * 多条件查询(即包含、并且包含) * @param client */ public static void multiSearchMust(TransportClient client) { SearchResponse response = client.prepareSearch("film").setTypes("dongzuo") .setQuery(QueryBuilders.boolQuery() .must(QueryBuilders.matchPhraseQuery("title", "战")) .must(QueryBuilders.matchPhraseQuery("content", "星球")) ).execute().actionGet(); SearchHits searchHits = response.getHits(); for(SearchHit searchHit : searchHits.getHits()) { System.out.println(searchHit.getSourceAsString()); } } /** * 多条件查询(即包含、并且不包含) * @param client */ public static void multiSearchMustNot(TransportClient client) { SearchResponse response = client.prepareSearch("film").setTypes("dongzuo") .setQuery(QueryBuilders.boolQuery() .must(QueryBuilders.matchPhraseQuery("title", "战")) .mustNot(QueryBuilders.matchPhraseQuery("content", "武士")) ).execute().actionGet(); SearchHits searchHits = response.getHits(); for(SearchHit searchHit : searchHits.getHits()) { System.out.println(searchHit.getSourceAsString()); } } /** * 多条件查询(加权显示) * @param client */ public static void multiSearchShould(TransportClient client) { SearchResponse response = client.prepareSearch("film").setTypes("dongzuo") .setQuery(QueryBuilders.boolQuery() .must(QueryBuilders.matchPhraseQuery("title", "战")) .should(QueryBuilders.matchPhraseQuery("content", "星球")) .should(QueryBuilders.rangeQuery("publishDate").gte("2018-01-01")) ).execute().actionGet(); SearchHits searchHits = response.getHits(); for(SearchHit searchHit : searchHits.getHits()) { System.out.println("搜索得分:"+searchHit.getScore()); System.out.println(searchHit.getSourceAsString()); } } /** * 多条件查询(过滤) * @param client */ public static void multiSearchFilter(TransportClient client) { SearchResponse response = client.prepareSearch("film").setTypes("dongzuo") .setQuery(QueryBuilders.boolQuery() .must(QueryBuilders.matchPhraseQuery("title", "战")) .filter(QueryBuilders.rangeQuery("price").lte("40")) ).execute().actionGet(); SearchHits searchHits = response.getHits(); for(SearchHit searchHit : searchHits.getHits()) { System.out.println(searchHit.getSourceAsString()); } } }

 

转载请注明原文地址: https://www.6miu.com/read-5033613.html

最新回复(0)