ETJava Beta | Java    注册   登录
  • elasticsearch 多条件查询 - 权重查询 should

    发表于 2024-04-09 22:12:26     阅读(200)     博客类别:Elasticsearch

    elasticsearch 多条件查询 - 权重查询 

    根据得分查询 should

    使用得分之前

    POST http://192.168.199.126:9200/film/dongzuo/_search/
    {
      "query": {
        "bool": {
          "must": [
            {
              "match": {
                "title": "战"
              }
            }
          ]
        }
      }
    }

    使用得分之后 should

    POST http://192.168.199.126:9200/film/dongzuo/_search/
    {
      "query": {
        "bool": {
          "must": {
            "match": {
              "title": "战"
            }
          },
          "should": [
            {
              "match": {
                "content": "星球"
              }
            },
            {
              "range": {
                "publishDate": {
                  "gte": "2018-01-01"
                }
              }
            }
          ]
        }
      }
    }

    使用得分查询 Java接口实现

    部分代码
    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();
            }
        }
    
    
    /**
         * 多条件查询 使用should 提高得分
         * @throws Exception
         */
    @Test
    public void searchMutil3()throws Exception{
        SearchRequestBuilder srb=client.prepareSearch("film").setTypes("dongzuo");
        QueryBuilder queryBuilder=QueryBuilders.matchPhraseQuery("title", "战");
        QueryBuilder queryBuilder2=QueryBuilders.matchPhraseQuery("content", "星球");
        // 范围查询 gte方法 不包含小写,gt方法包含小写 即 includeLower=true
        QueryBuilder queryBuilder3=QueryBuilders.rangeQuery("publishDate").gt("2018-01-01");// 范围查询 gt表示大于
        SearchResponse sr=srb.setQuery(QueryBuilders.boolQuery()
                                       .must(queryBuilder)
                                       .should(queryBuilder2)  // 设置权重
                                       .should(queryBuilder3)) // 设置权重
            .execute()
            .actionGet();
        SearchHits hits=sr.getHits();
        for(SearchHit hit:hits){
            System.out.println(hit.getScore()+":"+hit.getSourceAsString());
        }
    }