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 스크립트에 따라 약간의 변화를 하여 색인 재구성 기능을 실현했다. 기본적인 사고방식은 다음과 같다.
 
  • 새로운 index를 구축합니다
  • 새 index에 데이터를 삽입합니다
  • elasticsearch에서 기본적으로 생성된 맵핑을 수정합니다
  • 이전에 삽입된 기록을 삭제합니다(mapping 유지)
  • scroll_를 통해검색 이전 index에서 새 index로 데이터를 읽습니다..
  • 낡은 index를 삭제하고 다시 만듭니다
  • 이전 index에 데이터를 삽입합니다
  • elasticsearch에서 기본적으로 생성된 맵핑을 수정합니다
  • 이전에 삽입된 기록을 삭제합니다(mapping 유지)
  • scroll_를 통해검색은 새 인덱스에서 이전 인덱스로 데이터를 읽습니다

  • 이렇게 하면 문서마다 제목 필드가 두 가지 종류가 있습니다. 하나는 검색에 사용되고, 하나는 정렬에 사용됩니다.

    좋은 웹페이지 즐겨찾기