ElasticSearch - запрос с несколькими совпадениями, не возвращающий совпадений для данных, даже если они есть - NodeJS - PullRequest
1 голос
/ 29 мая 2020

Я пытаюсь получить список элементов, у которых есть поле: 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

1 Ответ

1 голос
/ 29 мая 2020

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

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

Из do c

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

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

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

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

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

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

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

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

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

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

Результат

 "hits": [
         {
            "_index": "filterbool",
            "_type": "_doc",
            "_id": "1",
            "_score": 0.0,
            "_source": {
               "active": true,
               "resellable": true
            }
         }
      ]
...