ElasticSearch에서 정렬 할 필드에 대한 매핑을 찾을 수 없습니다.


117

Elasticsearch는 SearchParseException정렬 기준에 사용 된 필드를 포함하지 않는 문서가 발견되면 쿼리를 구문 분석 하는 동안 잠시 발생합니다.

SearchParseException : 구문 분석 실패 [정렬 할 [가격]에 대한 매핑이 없음]

price필드 가 누락 된 문서도 어떻게 성공적으로 검색 할 수 있습니까?


1
귀하의 질문 / 답변으로 문제가 해결되었습니다. 감사합니다. 나는 그것을 다소 일반화하기 위해 편집했으며, 그것이 당신에게 적합하지 않다면 자유롭게 롤백하십시오.
Paul Bellora 2013

1
이 문제를 처리하기위한 참조 Elasticsearch Link
Ajeesh

답변:


116

더 많이 파고 나서 아래 주어진 해결책을 찾았습니다. 정렬 절에서 ignore_unmapped로 명시 적으로 설정해야합니다 true.

"sort" : [
       { "rating": {"order" : "desc" , "ignore_unmapped" : true} },
       { "price": {"order" : "asc" , "missing" : "_last" , "ignore_unmapped" : true} }
]

자세한 내용은 다음에 대한 Elasticsearch 참조를 살펴보십시오.


안녕하세요, 같은 문제가 있는데 어떻게 작동하는지 이해할 수 없습니다. 누락 된 속성과 ignore_unmapped가 함께 작동해야합니까? 예를 들어 missing을 "_last"로 설정하고 ignore_unmapped를 "false"로 설정하면 여전히 문제가 있지만 속성이 없더라도 모든 경우에 문서가 결과에 포함되기를 원합니다.
c4k

이 문제가 있고 _type이 비어 있으면 "ignore_unmapped"가 작동하지 않습니다 (즉, 색인 된 문서가없는 경우).
reinaldoluckman

7
새로운 전략은 unmapped_type
lukmdo

2
내 쿼리는 라이브러리 등을 업데이트하지 않고 오늘까지 항상 작동했지만 오늘 같은 오류가 발생하기 시작했습니다. 이제 추가 "ignore_unmapped" : true하고 다시 작동하기 시작했지만 이상한 것은 장면 뒤에서 일어난 일입니다! 누가 알아! 어쨌든 지금 작동합니다. +1
BentCoder

1
누군가 "누락"과 "매핑되지 않음"의 차이점을 명확히 할 수 있습니까? 특정 필드의 경우 일부 문서에는 있지만 다른 문서에는없는 경우 해당 필드는 "누락 됨"또는 "매핑되지 않음"으로 처리됩니까? "누락"은 필드가 문서에 있지만 해당 값이 null임을 의미합니까?
Sher10ck

43

모두의 예를 찾는 사람들을 위해 ignore_unmappedunmapped_type참조하십시오 여기에 내 대답을 .

"ignore_unmapped"는 이제 "unmapped_type"대신 사용되지 않습니다. 이것은 # 7039의 일부로 수행되었습니다.

문서에서 : 1.4.0 이전에는 ignore_unmapped 부울 매개 변수가 있었는데, 이는 내보낼 정렬 값을 결정하기에 정보가 충분하지 않았으며 교차 인덱스 검색에서 작동하지 않았습니다. 여전히 지원되지만 사용자는 대신 새로운 unmapped_type으로 마이그레이션하는 것이 좋습니다.

기본적으로 필드와 연결된 매핑이 없으면 검색 요청이 실패합니다. unmapped_type 옵션을 사용하면 매핑이없고 정렬되지 않은 필드를 무시할 수 있습니다. 이 매개 변수의 값은 내보낼 정렬 값을 결정하는 데 사용됩니다. 다음은 사용 방법의 예입니다.

{
    "sort" : [
        { "price" : {"unmapped_type" : "long"} },
    ],
    "query" : {
        "term" : { "user" : "kimchy" }
    }
}

쿼리 된 인덱스 중 가격에 대한 매핑이없는 경우 Elasticsearch는이 인덱스의 모든 문서에이 필드에 대한 값이없는 long 유형의 매핑이있는 것처럼 처리합니다.


3

분명히 ElasticSearch는 null 값을 정렬하지 않습니다. 나는 그것이 SQL 순서와 마찬가지로 null을 시작 또는 끝으로 취급한다고 가정했지만이 오류도 유발한다고 생각합니다.

따라서이 오류가 표시되면 정렬 속성이 ElasticSearch로 전송 될 때 기본값이 있는지 확인해야 할 수 있습니다.

정렬 열에 기본값이 없기 때문에 Rails + ElasticSearch + Tire에서이 오류가 발생하여 ES에 null로 전송되었습니다.

이 문제 는 null 값이 처리되고 있음을 나타내지 만 내 경험이 아닙니다. 어쨌든 시도할만한 가치가 있습니다.


2

동일한 문제가 발생했습니다 (sorta; 오류가 발생하지만 일부 결과가 표시됨). 제 경우에는 검색이 루트에서 발행되었고 (인덱스가 지정되지 않음) 검색 / 순서도 마찬가지 였기 때문에 오류가 발생했습니다. Kibana 색인을 찾고 있습니다.

어리석은 오류이지만 아마도 이것은 여기서 끝나는 다른 사람을 도울 것입니다.


나는 같은 문제가 있습니다 .. 그러나 매핑되지 않은 무시를 지정하면 루트를 검색 할 때 전혀 정렬되지 않습니다 ... 이것은 색인을 정의 해야하는 경우 나를 검색하는 기능을 제한합니다 ... 나는 단순히 모든 것을 원할 것입니다 일치하는 결과가있는 경우 필드별로 정렬하고 그렇지 않은 경우 기본값을 사용하여 채우십시오. 편집 :
mgoetzke

2

Elasticsearch 6.4

간단히 인덱스를 지정하면 Kibana에서 완료됩니다.

전에

GET /_search
{
 
  "query": {
    "exists": {
      "field": "document_id"
    }
  },
  "sort": [
    {
      "document_id": { "order": "asc"  },
      "created_at":  { "order": "desc" }
    }
  ]
}

GET /document-index/contact/_search  (here)
{

  "query": {
    "exists": {
      "field": "document_id"
    }
  },
  "sort": [
    {
      "document_id": { "order": "asc"  },
      "created_at":  { "order": "desc" }
    }
  ]
}


0

유연성을 제공하는 스크립트를 사용할 수도 있습니다.

"sort" : {
    "_script" : {
        "type" : "number",
        "script" : {
            "lang": "painless",
            "source": "return !doc['price'].empty ? doc['price'].value : 0"
        },
        "order" : "desc"
    }
}

0

added_on 이 date 인 아래 코드를 사용하면 어떻게 되나요 !! 속성 텍스트가 분석됩니다. 즉, 저장 될 때 고유 한 단어로 분할되고 필드에있는 하나 이상의 단어에 대한 자유 텍스트 검색이 가능합니다.

따라서 필드와 관련된 "텍스트"및 "키워드"가 있으므로 쿼리에서 집계를 사용해야하는 경우 일반적으로 키워드 인 필드 값이 필요합니다.

BEFORE

"_source":{....}
"query" : {...}
"sort": [
{
  "added_on": {
    "order": "desc"
  }
}
]

AFTER
"_source":{....}
"query" : {...}
"sort": [
{
  "added_on.keyword": {
    "order": "desc"
  }
}
]
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.