[Elasticsearch] 전체 텍스트 검색(二) - 다중 단어 검색 및 검색 병합
18194 단어 ElasticsearchSearch
다국어 쿼리(Multi-word Queries)
만약 우리가 한 번에 한 단어만 검색할 수 있다면, 전체 텍스트 검색은 상당히 유연하지 않을 것이다.다행히도
match
조회를 통해 다사 조회를 실현하는 것도 마찬가지로 간단하다.GET /my_index/my_type/_search
{
"query": {
"match": {
"title": "BROWN DOG!"
}
}
}
위의 쿼리는 다음 네 개의 문서를 모두 반환합니다.
{
"hits": [
{
"_id": "4",
"_score": 0.73185337,
"_source": {
"title": "Brown fox brown dog"
}
},
{
"_id": "2",
"_score": 0.47486103,
"_source": {
"title": "The quick brown fox jumps over the lazy dog"
}
},
{
"_id": "3",
"_score": 0.47486103,
"_source": {
"title": "The quick brown fox jumps over the quick dog"
}
},
{
"_id": "1",
"_score": 0.11914785,
"_source": {
"title": "The quick brown fox"
}
}
]
}
문서 4의 상관도는
"brown"
두 번과 "dog"
한 번을 포함하기 때문에 가장 높다.문서 2와 문서 3은 "brown"
및 "dog"
한 번을 포함하고 있으며, title
필드는 같은 길이를 가지고 있기 때문에 점수가 같습니다.문서 1에는 "brown"
만 포함되어 있습니다.match
조회는 두 개의 단어-["brown","dog"]
-내부에서 두 개term
조회를 실행하고 그 결과를 합쳐서 전체적인 결과를 얻어야 하기 때문이다.따라서 두 개의 term
조회를 하나의 bool
조회를 통해 조직할 것입니다. 우리는 합병 조회 1절에서 상세하게 소개할 것입니다.위의 예에서 받아들여야 할 경험은 문서의
title
필드에 최소한 하나의 지정된 단어만 포함하면 이 조회와 일치할 수 있다는 것이다.일치하는 단어가 많을수록 문서의 관련도가 높다는 것을 의미한다.정밀도 향상(Improving Precision)
모든 검색어를 일치시켜도 일치하면 최종 결과에서 무관해 보이는 일치하는 경우가 많다.그것은 산탄총 식의 전략(Shotgun Approach)이다.우리는 아마도 모든 검색 단어를 포함하는 문서만 표시하고 싶을 것이다.다시 말하면
brown OR dog
보다 우리가 더 원하는 결과는 brown AND dog
이다.match
쿼리는 기본값인 operator
매개변수를 수락합니다.모든 단어가 일치해야 한다는 것을 요구하기 위해 "or"
로 바꿀 수 있습니다.GET /my_index/my_type/_search
{
"query": {
"match": {
"title": {
"query": "BROWN DOG!",
"operator": "and"
}
}
}
}
"and"
조회의 구조는 match
파라미터를 수용하기 위해 약간 바뀌어야 한다.이 검색 결과는 문서 1을 제외합니다. 검색 단어만 포함되어 있기 때문입니다.
정밀도 제어(Controlling Precision)
all와any 중에서 선택하면 흑백이 아닌 느낌이 든다.만약 사용자가 5개의 검색어를 지정했는데 문서에 4개만 포함되어 있다면?
operator
를 "operator"
로 설정하면 제외됩니다.때때로 이것이 바로 당신이 원하는 것이지만, 대부분의 전문 검색의 사용 장면에 대해 관련도가 높은 문서를 결과에 포함하고 관련도가 낮은 것을 제외하기를 원할 것이다.다시 말하면 우리는 양자 사이에 개재된 방안이 필요하다.
"and"
검색 지원 match
매개 변수는 몇 개의 단어가 일치해야 이 문서를 관련 문서로 사용할 수 있는지 지정할 수 있습니다.비록 하나의 단어의 절대 수량을 지정할 수 있지만, 일반적으로 백분율을 지정하는 것은 더욱 의미가 있다. 왜냐하면 사용자가 몇 개의 단어를 입력하는지 제어할 수 없기 때문이다.GET /my_index/my_type/_search
{
"query": {
"match": {
"title": {
"query": "quick brown dog",
"minimum_should_match": "75%"
}
}
}
}
백분율로 지정하면
minimum_should_match
나머지 작업이 완료됩니다. 위에 3개의 단어가 있는 예에서 minimum_should_match
는 아래로 75%
, 즉 3개의 단어 중 2개로 반올림됩니다.입력한 것이 무엇이든지 간에 적어도 두 개의 단어가 일치해야만 이 문서는 최종 결과의 일원으로 간주될 수 있다.66.6%
매개 변수는 매우 유연하여 사용자가 입력한 단어의 수량에 따라 서로 다른 규칙을 적용할 수 있다.구체적으로 minimum_should_match
파라미터의 관련 문서를 참고할 수 있다.minimum_should_match
조회가 어떻게 다사 조회를 처리하는지 더 잘 이해하기 위해서, 우리는 match
조회가 어떻게 여러 개의 조회를 통합하는지 보아야 한다.질의 결합(Combining Queries)
필터 통합에서 우리는
bool
필터를 사용하여 여러 필터를 통합하여 bool
, and
, or
논리를 실현하는 것을 토론했다.not
조회도 비슷한 일을 했지만 현저한 차이가 있다.필터가 2원 결정을 내렸습니다. 이 문서는 결과 목록에 포함되어야 합니까?조회는 더욱 미묘하다.그것들은 문서를 포함할지 여부를 결정해야 할 뿐만 아니라, 이 문서가 얼마나 관련되어 있는지도 결정해야 한다.
필터와 유사하게
bool
조회는 bool
, must
및 must_not
파라미터를 통해 여러 개의 조회를 받습니다.예:GET /my_index/my_type/_search
{
"query": {
"bool": {
"must": { "match": { "title": "quick" }},
"must_not": { "match": { "title": "lazy" }},
"should": [
{ "match": { "title": "brown" }},
{ "match": { "title": "dog" }}
]
}
}
}
should
필드에 단어title
가 있고 단어quick
가 없는 문서는 결과로 반환됩니다.지금까지의 작업 방식은 lazy
필터와 매우 비슷하다.차이는 두 개의
bool
문장에서 비롯된다. 문서에 단어 should
나 brown
를 포함해야 한다는 요구를 받지 않지만, 만약 그것이 포함된다면 그것의 관련도는 더욱 높아져야 한다.{
"hits": [
{
"_id": "3",
"_score": 0.70134366,
"_source": {
"title": "The quick brown fox jumps over the quick dog"
}
},
{
"_id": "1",
"_score": 0.3312608,
"_source": {
"title": "The quick brown fox"
}
}
]
}
문서 3의 점수는
dog
및 brown
을 포함하기 때문에 더 높습니다.점수 계산(Score Calculation)
dog
조회는 일치하는 bool
문장과 must
문장의 should
를 더한 다음에 _score
문장과 must
문장의 총수를 나누어 관련도 점수should
를 얻는다._score
문장은 점수에 영향을 주지 않는다.그것들의 유일한 목적은 필요하지 않은 문서를 제외하는 것이다.정밀도 제어(Controlling Precision)
모든
must_not
문장은 일치해야 하고, 모든 must
문장은 일치할 수 없지만, must_not
문장은 몇 개 일치해야 합니까?기본적으로 should
문장은 하나도 일치하지 않습니다. 단지 하나의 특례만 있습니다. 만약 조회에 should
문장이 없다면, 최소한 must
문장은 일치해야 합니다.우리가
should
조회의 정밀도를 제어할 수 있듯이 match
파라미터를 통해 minimum_should_match
문장이 일치해야 하는 수량을 제어할 수 있다. 이 파라미터는 절대 수치나 백분율일 수 있다.GET /my_index/my_type/_search
{
"query": {
"bool": {
"should": [
{ "match": { "title": "brown" }},
{ "match": { "title": "fox" }},
{ "match": { "title": "dog" }}
],
"minimum_should_match": 2
}
}
}
위의 질의는 다음 문서만 포함합니다.
should
필드: title
또는 "brown" AND "fox"
또는 "brown" AND "dog"
만약 문서에 세 개의 단어가 모두 포함되어 있다면, 그것은 더욱 관련이 있다고 여겨질 것이다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 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에 따라 라이센스가 부여됩니다.