ElasticSearch가string 형식의 필드에서 정렬 오류 해결 방안
2849 단어 elasticsearch
문제
간단한 수요가 있다. 도서 정보를 열거하고 도서 제목의 사전 순서에 따라 배열한다.
간단할 줄 알았는데:
builder.addSort(SortBuilders.fieldSort("title").order(SortOrder.ASC));
이런 이상을 확실하게 보고할 줄은 생각지도 못했다.
Can’t sort on string types with more than one value per doc, or more than one token per field
원인 분석
예외 정보의 힌트에 따라 다음과 같은 두 가지 가능성이 있습니다.
1) 문서에string 형식의 정렬 필드가 두 개 있습니다
2) 정렬된 필드에 "token"이 여러 개 있습니다.
색인 문서를 검사했지만 "title"이 여러 개 발견되지 않았습니다. 두 번째 이유일 뿐입니다.
매핑에서 일반적으로 사용되는 문자열 형식의 필드:
"title":{
"type":"string"
}
tokenize를 할지 말지는 정해지지 않았지만, Elasticsearch는 기본적으로 tokenize를 한 것 같습니다.이것도 상식에 부합된다. 어쨌든 이 필드에서 검색해야 한다.하지만 정렬의 필요도 충족시켜야 한다.
다행히도 이미 해결 방안을 제공한 사람이 있다. 타이틀에 대한 멀티 매핑(http://blog.wiercinski.net/2011/uncategorized/elasticsearch-sorting-on-string-types-with-more-than-one-value-per-doc-or-more-than-one-token-per-field/)
구체적으로 말하면 문서의 맵핑을 다음과 같이 변경합니다.
"title" : {
"type" : "multi_field",
"fields" : {
"title" : {
"type" : "string"
},
"untouched" : {
"type" : "string",
"index" : "not_analyzed",
"include_in_all" : false
}
}
}
정렬할 때 다음과 같이 조정해야 합니다.
builder.addSort(SortBuilders.fieldSort("title.untouched").order(SortOrder.ASC));
후속 문제
이 문제는 이미 해결되었어야 하지만 기능을 다시 호출하는 데는 사전 순서에 따라 배열되지 않았다.
의심은 색인을 다시 만들어야 하는 문제다.
github에 라인이 있는 플러그인은 인덱스를 재구성할 수 있습니다https://github.com/karussell/elasticsearch-reindex
아쉽게도 나는 사용이 순조롭지 않다.
인터넷의 php 스크립트에 따라 약간의 변화를 하여 색인 재구성 기능을 실현했다. 기본적인 사고방식은 다음과 같다.
이렇게 하면 문서마다 제목 필드가 두 가지 종류가 있습니다. 하나는 검색에 사용되고, 하나는 정렬에 사용됩니다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
kafka connect e elasticsearch를 관찰할 수 있습니다.No menu lateral do dashboard tem a opção de connectors onde ele mostra todos os clusters do kafka connect conectados atu...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.