ElasticSearch — запрос с несколькими совпадениями, не возвращающий совпадений для данных, даже если они есть — NodeJS

Я пытаюсь получить список элементов, у которых есть поле: resellable: true.

Вот мой набор данных, который я могу увидеть, посетив: my-domain.com/_all/listings/_search

{
  "took" : 1,
  "timed_out" : false,
  "_shards" : {
    "total" : 5,
    "successful" : 5,
    "skipped" : 0,
    "failed" : 0
  },
  "hits" : {
    "total" : {
      "value" : 4,
      "relation" : "eq"
    },
    "max_score" : 1.0,
    "hits" : [
      {
        "_index" : "collectibles",
        "_type" : "listing",
        "_id" : "SseZfNbpdpBxc3O",
        "_score" : 1.0,
        "_source" : {
          "data" : {
            "resellable" : true,
            "active" : true,
            "description" : "<p>1234 123 123 123</p>",
            "title" : "2134",
            "has_store" : true,
            "createdAt" : "Wed May 27 2020 04:23:18 GMT+0000 (Coordinated Universal Time)",
            "apiURL" : "kJ9zsIsdQG8TZrRfPco4",
            "id" : "SseZfNbpdpBxc3O",
            "state" : "PENDING",
            "amount" : "21",
          }
        }
      }
}

Мой запрос использует *NodeJS and ElasticSearch.js*

let results = await client.search({
    index: params.category,
    type: "listing",
    body: {
        query: {
            multi_match: {
                query: true,
                fields: ['resellable', 'active'],
                type: 'best_fields',
            }
        }
    }
})

Ответ всегда no hits. Я пробовал match, я не пробовал best_fields, и, похоже, оно не соответствует значению.

Что я здесь делаю неправильно? Есть ли что-то еще, что вам нужно сделать, чтобы запросить элементы уровня _source.data?

ElasticSearch version: 7.4


person Zach    schedule 29.05.2020    source источник
comment
'resellable', 'active' должно быть 'data.resellable', data.'active'. Если вы посмотрите на свой вывод, перепродаваемый и активный, и часть поля данных _source : { data : { resellable : true или вам нужно исправить структуру вашего документа при индексации (удалить данные)   -  person jaspreet chahal    schedule 29.05.2020
comment
@jaspreetchahal да, это сделало это. Спасибо. Почему только data.active вместо _source.data.active?   -  person Zach    schedule 29.05.2020
comment
_source — это внутреннее поле в elastisearch, которое содержит все поле, оно не добавляется нами явно, поэтому его не нужно указывать.   -  person jaspreet chahal    schedule 29.05.2020


Ответы (1)


Вы используете "true" в строковом формате при использовании multi_match, в то время как вы проиндексировали данные в логическом формате true, и по этой причине вы не получаете никаких попаданий.

Я только что заметил, что оба ваших поля multi_match (resellable и active) являются логическими, тогда почему вы используете запрос multi_match, вместо этого вы должны использовать запрос логического фильтра, который также кэшируется и обеспечивает лучшую производительность.

Из документа

Предложения фильтра выполняются в контексте фильтра, что означает, что оценка игнорируется, а предложения рассматриваются для кэширования.

Пример сопоставления индексов

{
    "mappings": {
        "properties": {
            "active": {
                "type": "boolean"
            },
            "resellable" :{
                "type" : "boolean"
            }
        }
    }
}

Индексировать различные примеры документов

{
   "active" : true,
   "resellable" : true
}

{
   "active" : true,
   "resellable" : false
}

{
   "active" : false,
   "resellable" : false
}

{
   "active" : false,
   "resellable" : true
}

Поисковой запрос для получения документа, в котором оба значения верны

{
    "query": {
        "bool": {
            "filter": [
                {
                    "match": {
                        "active": true
                    }
                },
                {
                    "match": {
                        "resellable": true
                    }
                }
            ]
        }
    }
}

Результат

 "hits": [
         {
            "_index": "filterbool",
            "_type": "_doc",
            "_id": "1",
            "_score": 0.0,
            "_source": {
               "active": true,
               "resellable": true
            }
         }
      ]
person Community    schedule 29.05.2020
comment
Я только что протестировал без строкового значения и логического значения, и он по-прежнему возвращает ноль совпадений. Я обновил свой пост, чтобы отразить это. Для запроса фильтра - как установить несколько полей для перепродажи и активности? - person Zach; 29.05.2020
comment
@ Зак, спасибо, я работаю над тем, чтобы предоставить рабочий образец. - person ; 29.05.2020
comment
@ Зак, ты хочешь, чтобы и resellable, и active были правильными, как указано в твоем образце документа. - person ; 29.05.2020
comment
Мой запрос динамический, у пользователя может быть перепродаваемый и неактивный или активный и не перепродаваемый. Итак, у меня есть массив с параметрами фильтра, которые я передаю в поля. Но поскольку я возвращал 0 совпадений, я жестко закодировал значения, чтобы увидеть, была ли это проблема с форматированием или я ничего не получал независимо от форматирования. Фильтр запроса с помощью терминов кажется, что я не смогу использовать динамические термины? - person Zach; 29.05.2020
comment
@ Зак, понял, это не должно быть проблемой, я только что получил решение и обновил ответ (подсказка, вам нужно использовать фильтр в своем поисковом запросе и ссылаться на ссылку запроса логического фильтра в моем ответе) - person ; 29.05.2020
comment
@ Зак, ты решил это, я видел в комментариях к вопросу и пропустил поле data в твоем случае, но в идеале вы должны использовать предложение фильтра для построения этих запросов, как указано в ссылке, и обновил мой ответ тем же Filter clauses are executed in filter context, meaning that scoring is ignored and clauses are considered for caching. - person ; 29.05.2020
comment
@ Зак, не могли бы вы проверить мои последние комментарии и ответить :) Заранее спасибо - person ; 03.06.2020
comment
Спасибо за ответы. Вы многим помогли и проблема решена. это была проблема с data.resellable и not resellable, а также с истинными и истинными типами - person Zach; 23.06.2020
comment
@ Зак, вау, большое спасибо за ответ и принятие ответа, это поможет другим читателям, и было бы здорово, если бы вы могли проголосовать за ответ, если это еще не сделано, я только что ответил на ваш вопрос :) - person ; 23.06.2020