0

我正在尝试获取具有以下字段的项目列表: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。我试过 a match,我试过 no best_fields,它似乎与值不匹配。

我在这里做错了什么?您还需要做些什么来查询_source.data关卡项目吗?

ElasticSearch version: 7.4

4

1 回答 1

1

"true"在使用 multi_match 时使用的是字符串格式,而您以布尔格式索引数据,true这就是您没有得到任何命中的原因。

我刚刚注意到您的两个multi_match字段(resellableactive)都是布尔值,那么为什么您使用 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
}

搜索查询以获取两个值都为 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
            }
         }
      ]
于 2020-05-29T08:14:44.600 回答