Не знайдено відображення для поля для сортування в ElasticSearch


117

Elasticsearch кидає SearchParseExceptionзапит на час аналізу, якщо знайдені документи, що не містять поля, використовуваного в критеріях сортування.

SearchParseException: Неможливо проаналізувати [Не знайдено відображення для [ціни] для сортування]

Як я можу успішно шукати ці документи, навіть якщо в деяких відсутні priceполя?


1
Ваше питання / відповідь вирішило мою проблему - дякую. Я відредагував це, щоб дещо узагальнити, сміливо відкатуйтесь, якщо це вам не підходить.
Пол Беллора

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 повинні працювати разом, правда? Якщо, наприклад, я встановив відсутність "_last" і ignore_unmapped до "false", у мене все ще є проблема, але я хочу, щоб документи були у результатах у всіх випадках, навіть якщо вони не мають атрибута.
c4k

У мене ця проблема, і "ignore_unmapped" не працює, якщо ваш _тип порожній (тобто без індексованого документа).
reinaldoluckman

7
Виглядає як нова стратегія полягає в використанні unmapped_type
lukmdo

2
Мої запити завжди працювали до сьогодні, не оновлюючи бібліотеки тощо, але сьогодні я почав отримувати цю саму помилку. Я зараз додав, "ignore_unmapped" : trueі він почав працювати знову, але дивно, що сталося за сценою! Хто знає! У всякому разі, це працює і зараз. +1
BentCoder

1
Чи може хтось уточнити різницю між "відсутньою" та "непоміченою"? Якщо для певного поля, якщо в деяких документах є його, а в інших немає, чи таке поле трактується як "відсутнє" чи "невідоме"? Чи означає "відсутність" поле в документі, але відповідне значення є нульовим?
Шер10к

43

Для тих, хто шукає приклад обох ignore_unmappedі unmapped_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 буде обробляти його так, як ніби було відображення типу типу, і всі документи цього індексу не мають значення для цього поля.


3

Мабуть, ElasticSearch не сортуватиме за нульовими значеннями. Я припускав, що це буде вважати null таким, що знаходиться на початку або в кінці (як і впорядкування SQL), але я вважаю, що це також викликає цю помилку.

Отже, якщо ви бачите цю помилку, вам може знадобитися переконатися, що атрибут сортування має значення за замовчуванням, коли він надсилається в ElasticSearch.

У мене виникла помилка з Rails + ElasticSearch + Tire, оскільки стовпець сортування не мав значення за замовчуванням, тому його відправляли в ES як null.

У цьому питанні вказано, що нульові значення обробляються, але це не був мій досвід. Це все-таки варто спробувати.


2

У мене виникла та сама проблема (сорта; я отримав би деякі помилки, але деякі результати), але в моєму випадку мій пошук видався в корені (не вказано індекс), і помилки, які я отримував, були тому, що пошук / замовлення також дивлячись на індекс Кібана.

Дурна помилка, але, можливо, це допоможе комусь, хто опиниться тут.


У мене така ж проблема .. але коли я вказую ігнорувати невідоме, я взагалі не отримую сортування під час пошуку кореня ... це обмежує можливість пошуку мене, якщо мені доведеться визначити індекс ... я просто хотів би всіх відповідні результати будуть відсортовані за полем, якщо вони є, і заповнити використовувати за замовчуванням для тих, хто не .. EDIT:
mgoetzke

2

Еластичний пошук 6.4

просто вкажіть індекс, і це все в Кібані

ПЕРЕД

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

Коли ми використовуємо код нижче, де date_on дата, що відбувається !! текст атрибута аналізується, тобто він розбивається на окремі слова при зберіганні і дозволяє здійснювати пошук вільного тексту на одному або декількох словах у полі

значить, "тексти" та "ключові слова" пов'язані з полями, тому якщо нам потрібно використовувати агрегацію в запиті, нам потрібне значення поля загалом для ключового слова.

BEFORE

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

AFTER
"_source":{....}
"query" : {...}
"sort": [
{
  "added_on.keyword": {
    "order": "desc"
  }
}
]
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.