Elasticsearch의 (19)cross-fields 정책
9430 단어 Elasticsearch
여러 개의 필드를 뛰어넘어 하나의 표지를 검색합니다. 예를 들어 한 사람의 이름이나 주소를 검색하면cross-fields 검색입니다.
초보적으로 말하면 실현하려면most_fields가 잘 어울려요.왜냐하면 best_fields는 하나의 필드를 우선적으로 검색하는 가장 일치하는 결과입니다.cross-fields 자체는field의 문제가 아닙니다.
POST /forum/article/_bulk
{ "update": { "_id": "1"} }
{ "doc" : {"author_first_name" : "Peter", "author_last_name" : "Smith"} }
{ "update": { "_id": "2"} }
{ "doc" : {"author_first_name" : "Smith", "author_last_name" : "Williams"} }
{ "update": { "_id": "3"} }
{ "doc" : {"author_first_name" : "Jack", "author_last_name" : "Ma"} }
{ "update": { "_id": "4"} }
{ "doc" : {"author_first_name" : "Robbin", "author_last_name" : "Li"} }
{ "update": { "_id": "5"} }
{ "doc" : {"author_first_name" : "Tonny", "author_last_name" : "Peter Smith"} }
GET /forum/article/_search
{
"query": {
"multi_match": {
"query": "Peter Smith",
"type": "most_fields",
"fields": [ "author_first_name", "author_last_name" ]
}
}
}
Peter Smith, 일치 author_first_name, Smith와 일치합니다. 이때 점수가 높습니다. 왜요??
IDF 점수가 높기 때문에 IDF 점수가 높습니다. 그러면 이 일치한term(Smith)은 모든doc에서 나타나는 빈도가 낮습니다.author_first_name field에서 Smith가 한 번 나타났습니다.
Peter Smith라는 사람, doc 1, Smith는 author_last_name 중, 하지만 author_last_name에 Smith가 두 번 나타나서 doc1의 IDF 점수가 낮아졌습니다.
너무 많은 의문을 품지 마라, 틀림없이 이렇겠니?
{
"took": 2,
"timed_out": false,
"_shards": {
"total": 5,
"successful": 5,
"failed": 0
},
"hits": {
"total": 3,
"max_score": 0.6931472,
"hits": [
{
"_index": "forum",
"_type": "article",
"_id": "2",
"_score": 0.6931472,
"_source": {
"articleID": "KDKE-B-9947-#kL5",
"userID": 1,
"hidden": false,
"postDate": "2017-01-02",
"tag": [
"java"
],
"tag_cnt": 1,
"view_cnt": 50,
"title": "this is java blog",
"content": "i think java is the best programming language",
"sub_title": "learned a lot of course",
"author_first_name": "Smith",
"author_last_name": "Williams"
}
},
{
"_index": "forum",
"_type": "article",
"_id": "1",
"_score": 0.5753642,
"_source": {
"articleID": "XHDK-A-1293-#fJ3",
"userID": 1,
"hidden": false,
"postDate": "2017-01-01",
"tag": [
"java",
"hadoop"
],
"tag_cnt": 2,
"view_cnt": 30,
"title": "this is java and elasticsearch blog",
"content": "i like to write best elasticsearch article",
"sub_title": "learning more courses",
"author_first_name": "Peter",
"author_last_name": "Smith"
}
},
{
"_index": "forum",
"_type": "article",
"_id": "5",
"_score": 0.51623213,
"_source": {
"articleID": "DHJK-B-1395-#Ky5",
"userID": 3,
"hidden": false,
"postDate": "2017-03-01",
"tag": [
"elasticsearch"
],
"tag_cnt": 1,
"view_cnt": 10,
"title": "this is spark blog",
"content": "spark is best big data solution based on scala ,an programming language similar to java",
"sub_title": "haha, hello world",
"author_first_name": "Tonny",
"author_last_name": "Peter Smith"
}
}
]
}
}
문제1: 가능한 한 많은field가 일치하는doc를 찾을 뿐, 어떤field가 완전히 일치하는doc가 아닙니다.
문제 2: most_fields, minimum_should_match는 긴 꼬리 데이터를 제거하면 일치하는 결과가 매우 적다
문제 3: TF/IDF 알고리즘, 예를 들어 Peter Smith와 Smith Williams, Peter Smith를 검색할 때first_name에는 Smith가 거의 없기 때문에query는 모든 문서에서 빈도가 낮고 점수가 높습니다. 아마도 Smith Williams는 오히려 Peter Smith 앞에 있을 것입니다.
첫 번째 방법:copy_로to, 여러 필드를 하나의 필드로 조합
문제는 사실 여러 개의 필드가 있고 여러 개의 필드가 있는 이후로 매우 난처하다. 우리는 하나의 표지를 여러 개의 필드를 뛰어넘는 상황을 생각해서 하나의 필드로 합치면 된다.예를 들면, 한 사람의 이름은 원래first_name,last_name, 이제 하나로 통합full_name, 오케이 했잖아...
PUT /forum/_mapping/article
{
"properties": {
"new_author_first_name": {
"type": "string",
"copy_to": "new_author_full_name"
},
"new_author_last_name": {
"type": "string",
"copy_to": "new_author_full_name"
},
"new_author_full_name": {
"type": "string"
}
}
}
이걸로 copy_to 문법 이후 여러 필드의 값을 한 필드로 복사하고 역렬 인덱스를 만들 수 있습니다
POST /forum/article/_bulk
{ "update": { "_id": "1"} }
{ "doc" : {"new_author_first_name" : "Peter", "new_author_last_name" : "Smith"} } --> Peter Smith
{ "update": { "_id": "2"} }
{ "doc" : {"new_author_first_name" : "Smith", "new_author_last_name" : "Williams"} } --> Smith Williams
{ "update": { "_id": "3"} }
{ "doc" : {"new_author_first_name" : "Jack", "new_author_last_name" : "Ma"} } --> Jack Ma
{ "update": { "_id": "4"} }
{ "doc" : {"new_author_first_name" : "Robbin", "new_author_last_name" : "Li"} } --> Robbin Li
{ "update": { "_id": "5"} }
{ "doc" : {"new_author_first_name" : "Tonny", "new_author_last_name" : "Peter Smith"} } --> Tonny Peter Smith
GET /forum/article/_search
{
"query": {
"match": {
"new_author_full_name": "Peter Smith"
}
}
}
문제1: 가능한 한 많은field가 일치하는doc를 찾을 뿐, 어떤field가 완전히 일치하는doc-->가 해결되지 않습니다. 가장 일치하는document가 가장 먼저 되돌아옵니다.
문제 2: most_fields, minimum_should_match는 긴 꼬리 데이터를 제거하면 일치하는 결과가 매우 적다
--> 해결, minimum_ 사용 가능should_match 긴 꼬리 데이터 삭제
문제 3: TF/IDF 알고리즘, 예를 들어 Peter Smith와 Smith Williams, Peter Smith를 검색할 때first_Smith가 거의 없기 때문에query는 모든 문서에서 빈도가 낮고 점수가 높습니다. 아마도 Smith Williams는 오히려 Peter Smith 앞에 있을 것입니다. --> 해결합니다. Smith와 Peter는 하나의 필드에 있기 때문에 모든 문서에서 나타나는 횟수는 균일하고 극단적인 편차가 없습니다.
multi_match + cross_fields
GET /forum/article/_search
{
"query": {
"multi_match": {
"query": "Peter Smith",
"type": "cross_fields",
"operator": "and",
"fields": ["author_first_name", "author_last_name"]
}
}
}
문제1: 가능한 한 많은field가 일치하는doc를 찾을 뿐, 모든field가 완전히 일치하는doc-->가 아니라, 모든term가 모든field에 나타나야 합니다.
Peter,Smith
Peter는 author_first_name 또는 author_last_name에 표시
Smith는 author_first_name 또는 author_last_name에 표시
Peter Smith는 여러 field에 가로놓여 있을 수 있기 때문에 모든 term이 특정한 field에 나타나도록 요구해야 조합을 해야만 우리가 원하는 표지, 완전한 인명을 구성할 수 있다
원래 most_fiels, Smith Williams 같을 수도 있고, most_fields 요구는 어느 field만 일치하면 됩니다. 일치하는 field가 많을수록 점수가 높습니다.
문제 2: most_fields, minimum_should_match는 긴 꼬리 데이터를 제거하는 것이 일치하는 아주 적은 결과입니다. -> 해결합니다. 모든 term이 요구하면 긴 꼬리는 제거됩니다.
java hadoop spark --> 이 세 개의 term은 어느 필드에서든 나타나야 합니다
예를 들어 어떤 문서는 필드 하나에java가 포함되어 있으면 삭제되고 긴 꼬리로 사라진다
문제 3: TF/IDF 알고리즘, 예를 들어 Peter Smith와 Smith Williams, Peter Smith를 검색할 때first_Smith가 거의 없기 때문에query는 모든 문서에서 빈도가 낮고 점수가 높습니다. 아마도 Smith Williams는 오히려 Peter Smith 앞에 있을 것입니다. --> IDF를 계산할 때 각각query가 각 field에 있는 IDF를 꺼내서 최소값을 취하면 극단적인 상황에서 최대치가 나타나지 않을 것입니다.
Peter Smith
Peter
Smith
Smith, author_first_name 이field에서 모든doc의 이Field에서 나타나는 빈도가 낮아서 IDF 점수가 높습니다.Smith는 모든 doc의 author_last_name field의 주파수는 IDF 점수를 계산합니다. 일반적으로last_name의 Smith 빈도가 높기 때문에 IDF 점수는 정상적이고 높지 않습니다.그리고 Smith의 경우 두 개의 IDF 점수 중 작은 점수를 얻습니다.IDF가 지나치게 높은 점수를 받는 일은 없을 것이다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 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에 따라 라이센스가 부여됩니다.