Elasticsearch Query DSL의 Compound queries(복합 질의)
32390 단어 Elasticsearch
복합 조회는 다른 복합 조회나 잎 조회를 포장하여 그들의 결과와 점수를 조합하여 그들의 행동을 바꾸거나 조회 문장에서 필터 상하문 모드로 전환한다.
주요 복합 질의는 다음과 같습니다.
이 섹션 디렉토리
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 지정.
복합 조회는 여기까지 하겠습니다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
Embulk를 사용하여 ElasticCloud로 보내기Embulk에서 ElasticCloud에 보낼 수 있을까라고 생각비망록도 겸해 기술을 남깁니다 Embulk 설치 ElasticCloud (14 일 체험판) brew라면 아래 명령 입력 파일 만들기 파일 내용 seed...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.