ETJava Beta | Java    注册   登录
  • elasticsearch 多条件查询 - 包含查询 must

    发表于 2024-04-09 22:04:43     阅读(199)     博客类别:Elasticsearch

    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());
        }
    }