Elasticsearch Query DSL의 Compound queries(복합 질의)

32390 단어 Elasticsearch
이 장에서는 Elasticsearch DSL 질의 구문에 대한 복합 질의를 시작합니다.
복합 조회는 다른 복합 조회나 잎 조회를 포장하여 그들의 결과와 점수를 조합하여 그들의 행동을 바꾸거나 조회 문장에서 필터 상하문 모드로 전환한다.
주요 복합 질의는 다음과 같습니다.
  • constant_score query
  • bool query
  • dis_max query
  • function_score query
  • boosting query

  • 이 섹션 디렉토리

  • 1、constant_score query
  • 2、bool query
  • 2.1 필터 상하문(filtercontext)에서 조회가 관련성(점수)에 미치는 영향
  • 3、dis max query
  • 4,functionscorequery(함수 분수 조회)
  • 5、boosting query

  • 1、constant_score query


    상수 (score) 평점 조회, 이 복합 조회는 문서 자체의 일치 관련성 평점을 무시하고 요청 매개 변수의 boost를 통일적으로 되돌려줍니다.
    예제 설명: (JAVA 예제)
    public static void testConstantScoreQuery() {
    		RestHighLevelClient client = EsClient.getClient();
    		try {
    			SearchRequest searchRequest = new SearchRequest();
    			searchRequest.indices("twitter");
    			SearchSourceBuilder sourceBuilder = new SearchSourceBuilder();
    			sourceBuilder.query(
    					QueryBuilders.constantScoreQuery(QueryBuilders.wildcardQuery("user", "ding*"))
    					.boost(1.5f)
    			);
    			searchRequest.source(sourceBuilder);
    			SearchResponse result = client.search(searchRequest, RequestOptions.DEFAULT);
    			System.out.println(result);
    		} catch (Throwable e) {
    			e.printStackTrace();
    		} finally {
    			EsClient.close(client);
    		}
    	}
    

    결과: 비교를 위해 왼쪽의 결과는QueryBuilders입니다.wildcardQuery("user", "ding*") 조회, 오른쪽은constant_score.
    {                                                                    {
        "took":4,    														"took":2,
        "timed_out":false,													"timed_out":false,
        "_shards":{															"_shards":{
            "total":5,															"total":5,
            "successful":5,														"successful":5,
            "skipped":0,														"skipped":0,
            "failed":0															"failed":0
        },																	},
        "hits":{															"hits":{
            "total":1,															"total":1,
            "max_score":0.9808292,												"max_score":1.5,
            "hits":[															"hits":[
                {																	{
                    "_index":"twitter",													"_index":"twitter",
                    "_type":"_doc",														"_type":"_doc",
                    "_id":"12",															"_id":"12",
                    "_score":0.9808292,													"_score":1.5,
                    "_source":{															"_source":{
                        "post_date":"2009-11-18T14:12:12",									"post_date":"2009-11-18T14:12:12",
                        "message":"test bulk",												"message":"test bulk",
                        "user":"dingw"														"user":"dingw"
                    }																	}
                }																	}
            ]																	]
        }																	}
    }																	}
    

    2、bool query


    부울 조회.boolquery에 포함할 수 있는 주요 글꼴 유형은 다음과 같습니다.
    글꼴 유형
    묘사
    must
    이 글꼴 유형의 조회 문장은 문서가 만족해야 하며 평점에 영향을 미친다(상관도)
    filter
    일치하는 문서에 서브문장 (질의) 이 나타나야 합니다.그러나must와 달리 조회의 점수는 무시됩니다.필터 서브문장은 필터 상하문에서 실행되며, 서브문장은 캐시에 사용됩니다.
    should
    일치해야 한다.must와 filter가 없으면 여러 should가 최소한 한 개만 일치하면 됩니다. 이 데이터는 매개 변수 minimum_를 통해should_match 제어,must나 filter가 포함되어 있으면should는 실제 필터에 참여하지 않지만 평점에 참여합니다.
    must_not
    조회 조건 반향 및 일치하는 문서는 must_에 맞지 않아야 합니다.not의 조건.

    2.1 필터 상하문(filter context)에서 조회가 관련성(점수)에 미치는 영향


    상하문 환경을 필터하는 검색 문구는 관련성에 영향을 미치지 않는다. 즉, 상하문에 있는 검색 문구를 필터하면 되돌아오는 score는 0이다.예를 들어 다음과 같은 질의 예제(Java로 작성):
    public static void testBoolQuery_filterContext_score() {
    		RestHighLevelClient client = EsClient.getClient();
    		try {
    			SearchRequest searchRequest = new SearchRequest();
    			searchRequest.indices("twitter");
    			SearchSourceBuilder sourceBuilder = new SearchSourceBuilder();
    			sourceBuilder.query(
    					QueryBuilders.boolQuery()
    											.filter(QueryBuilders.termQuery("user", "dingw"))
    			);
    			searchRequest.source(sourceBuilder);
    			SearchResponse result = client.search(searchRequest, RequestOptions.DEFAULT);
    			System.out.println(result);
    		} catch (Throwable e) {
    			e.printStackTrace();
    		} finally {
    			EsClient.close(client);
    		}
    	}
    

    score가 0으로 반환된 결과는 다음과 같습니다.
    {
        "took":4,
        "timed_out":false,
        "_shards":{
            "total":5,
            "successful":5,
            "skipped":0,
            "failed":0
        },
        "hits":{
            "total":3,
            "max_score":0,
            "hits":[
                {
                    "_index":"twitter",
                    "_type":"_doc",
                    "_id":"22",
                    "_score":0,
                    "_source":{
                        "post_date":"2018-10-31T14:12:10",
                        "message":"ab and hell",
                        "user":"dingw"
                    }
                },
                {
                    "_index":"twitter",
                    "_type":"_doc",
                    "_id":"12",
                    "_score":0,
                    "_source":{
                        "post_date":"2009-11-18T14:12:12",
                        "message":"test bulk",
                        "user":"dingw"
                    }
                },
                {
                    "_index":"twitter",
                    "_type":"_doc",
                    "_id":"11",
                    "_score":0,
                    "_source":{
                        "post_date":"2009-11-19T14:12:12",
                        "message":"test bulk update",
                        "user":"dingw"
                    }
                }
            ]
        }
    }
    

    3、dis max query


    이 조회 방식은 모든 조회 문구를 연합 조회 (union) 합니다. 그 중 하나의 조건이 일치하는 문서만 필요하지만, 관련성을 계산할 때 모든 조건의 일치도 (score) 를 더하는 것이 아니라, 가장 높은 평점을 받은 조회 조건을 사용하는 score를 사용합니다. 지정tie_breaker라면 최대 score에 다른 score*tie_breaker.dis maxquery는 구현(matchquery multi fields best_fields)의 핵심입니다.모든 쿼리는 채점 인자(권중, boost)를 지정할 수 있으며, dis maxquery 사용 예:
    	/**
    	 * dis max query
    	 */
    	public static void testDisMaxQuery() {
    		RestHighLevelClient client = EsClient.getClient();
    		try {
    			SearchRequest searchRequest = new SearchRequest();
    			searchRequest.indices("twitter");
    			SearchSourceBuilder sourceBuilder = new SearchSourceBuilder();
    			sourceBuilder.query(
    					QueryBuilders.disMaxQuery()
    //										.tieBreaker(0.1f)
    										.add(QueryBuilders.termQuery("user", "dingw").boost(1.2f))
    										.add(QueryBuilders.termQuery("message", "bulk"))
    			);
    			searchRequest.source(sourceBuilder);
    			SearchResponse result = client.search(searchRequest, RequestOptions.DEFAULT);
    			System.out.println(result);
    		} catch (Throwable e) {
    			e.printStackTrace();
    		} finally {
    			EsClient.close(client);
    		}
    	}
    

    4,functionscorequery(함수 분수 조회)


    연구를 기다리다.

    5、boosting query


    boostingquery는 일부 검색 조건의 무게를 높이거나 낮출 수 있습니다.예를 들면 다음과 같습니다.
    GET /_search
    {
        "query": {
            "boosting" : {
                "positive" : {                                      // @1
                    "term" : {
                        "field1" : "value1"
                    }
                },
                "negative" : {                                // @2
                     "term" : {
                         "field2" : "value2"
                    }
                },
                "negative_boost" : 0.2               
            }
        }
    }
    

    코드 @1: 적극적인 역할로 권중을 높인다.코드 @2: 부정적인 영향, 그 무게를 낮추고자 합니다. 그 무게 값은negative_를 통해boost 지정.
    복합 조회는 여기까지 하겠습니다.

    좋은 웹페이지 즐겨찾기