用于搜索与其他值完全匹配的内容的ElasticSearch查询

时间:2017-11-01 12:56:59

标签: elasticsearch elasticsearch-query

在ElasticSearch中我遵循下面给出的示例文档结构的文档:

    {
        "ProductType": "TV",
        "Manufacturer": "XYZ",
        "Model": "XYZ-52-TV",
        "ProductDocumentationTopic": "DeviceSpecifications",
        "Content": "Lorem ipsum screen size = 10 Minim eu laborum ex veniam et ut commodo ullamco culpa irure ad nulla veniam et irure deserunt eiusmod nostrud"
    }

我尝试仅在确切的特定产品中搜索Content值。 将通过完全匹配ProductTypeManufacturerModelProductDocumentationTopic的值来识别产品。

因此,按照上面给出的示例,我如何在" DeviceSpecifications"内搜索Content。 " XYZ-52-TV"由" XYZ制造的模型电视"?

请引导适当的ElasticSearch查询。

1 个答案:

答案 0 :(得分:0)

您应该从正确的映射定义开始,这将告诉Elasticsearch如何将您的字段存储在索引中。默认情况下,将分析JSON中的每个字符串,这意味着您可以在此类字段上执行全文搜索。更多信息here

除了Content之外,它并不是您想要实现的所有字段。因此,如果您要对所有其他字段进行过滤,则应在映射定义中将其定义为 keywords

PUT http://{yourhost+port}/{indexname} HTTP/1.1

{
   "mappings": {
     "{yourtypename}": {
         "properties": {
            "ProductType": {
               "type": "keyword"
             },
             "Manufacturer": {
                "type": "keyword"
             },
             "Model": {
                "type": "keyword"
             },
             "ProductDocumentationTopic": {
                "type": "keyword"
             },
             "Content": {
                "type": "text"
             }
          }
       }
    }
 }

然后您可以使用带过滤器的查询,您可以在其中对内容字段执行全文搜索,并为所有其他字段执行完全匹配(docs

{
   "query": { 
      "bool": { 
         "must": [
            { "match": { "Content":   "size" }}  
         ],
         "filter": [ 
          { "term":  { "Model": "XYZ-52-TV" }},
          { "term":  { "Manufacturer": "XYZ" }},
          { "term":  { "ProductType": "TV" }}
       ]
      }
    }
  }