通过URL和帖子正文搜索之间的区别

时间:2015-09-16 08:02:15

标签: search elasticsearch

我尝试根据对象的属性值构建搜索查询,该属性值位于嵌套数组中。

一切正常

curl -s -XGET 'http://localhost:9200/products/product/_search?q=items.sku:ABC123'

这不起作用。为什么,我缺少什么?:

{
  "_source" : "items",
  "query": {
    "term" : {
      "items.sku" : "ABC123"
    }
  }
}

我要检索的项目如下所示:

{
  "name" : "Example product"
  "brand" : {
    "id" : 123,
    "name" : "Nike"
  },
  "items" : [
    {
      id: 234,
      sku: "ABC123"
    },
    {
      id: 456,
      sku: "XYZ963"
    }
  ]
}

1 个答案:

答案 0 :(得分:3)

查询不起作用,因为它没有使用与q运算符相同的运算符。

q运算符是使用query_string查询的“捷径”。您所做的事情的等效查询实际上如下:

{
  "_source": "items",
  "query": {
    "query_string": {
      "query": "items.sku:ABC123"
    }
  }
}

按预期输出文件:

"hits": {
      "total": 1,
      "max_score": 0.19178301,
      "hits": [
         {
            "_index": "products",
            "_type": "product",
            "_id": "AU_VTrjXeQSEeO15aKQi",
            "_score": 0.19178301,
            "_source": {
               "items": [
                  {
                     "id": 234,
                     "sku": "ABC123"
                  },
                  {
                     "id": 456,
                     "sku": "XYZ963"
                  }
               ]
            }
         }
      ]
   }

区别在于term查询搜索未分析的值(在您的示例中为ABC123),而query_string选择分析或不分析值根据被查询的字段的映射。

我认为,在您的情况下,您的字段items.sku的映射只是string,这意味着默认情况下,您的字段已分析 {{1} } analyzer:您的值已被编入索引standard,因为它已经小写(请参阅standard analyzer documentation)。

我建议您阅读ElasticSearch权威指南的分析部分(请参阅here),以便更好地理解这一点。