对象的Elasticsearch嵌套在objects数组下

时间:2017-04-28 06:01:04

标签: elasticsearch

假设我有以下索引结构:

{
  "title": "Early snow this year",
  "body": "After a year with hardly any snow, this is going to be a serious winter",
  "source": [
    {
      "name":"CNN",
      "details": {
        "site": "cnn.com"
      }
    },
    {
      "name":"BBC",
      "details": {
        "site": "bbc.com"
      }
    }
  ]
}

我有一个bool查询试图在这里检索这个文件:

{
  "query": {
    "bool" : {
      "must" : {
        "query_string" : {
          "query" : "snow",
          "fields" : ["title", "body"] 
        }
      },
      "filter": {
        "bool": {
            "must" : [
                { "term" : {"source.name" : "bbc"}},
                { "term" : {"source.details.site" : "BBC.COM"}}
            ]
        }
      }
    }
  }
}'

但它没有使用零点击,我应该如何修改我的查询?它仅在我删除{ "term" : {"source.details.site" : "BBC.COM"}}时才有效。

以下是映射:

{
  "news" : {
    "mappings" : {
      "article" : {
        "properties" : {
          "body" : {
            "type" : "text",
            "fields" : {
              "keyword" : {
                "type" : "keyword",
                "ignore_above" : 256
              }
            }
          },
          "source" : {
            "properties" : {
              "details" : {
                "properties" : {
                  "site" : {
                    "type" : "text",
                    "fields" : {
                      "keyword" : {
                        "type" : "keyword",
                        "ignore_above" : 256
                      }
                    }
                  }
                }
              },
              "name" : {
                "type" : "text",
                "fields" : {
                  "keyword" : {
                    "type" : "keyword",
                    "ignore_above" : 256
                  }
                }
              }
            }
          },
          "title" : {
            "type" : "text",
            "fields" : {
              "keyword" : {
                "type" : "keyword",
                "ignore_above" : 256
              }
            }
          }
        }
      }
    }
  }
}

1 个答案:

答案 0 :(得分:0)

您正在" source.details.site"上进行术语查询。术语查询表示在查询时不会分析您提供的值。如果您使用默认映射,那么source.details.site将是小写的。现在当你用term和" BBC.COM"," BBC.COM"不会被分析,ES正试图匹配" BBC.COM"与" bbc.com" (因为它在索引时间是小写的)并且结果是错误的 您可以使用匹配而不是术语来分析它。但是最好在关键字字段上使用术语查询,事先就知道要编入索引的确切内容。术语查询具有从ES端缓存的优点,并且比匹配查询更快。

您应该在索引时清理数据,因为您将编写一次并始终阅读。所以像" /"," http"如果你没有丢失语义,应该删除。您可以在编制索引时通过代码实现此目的,也可以在映射中创建自定义analysers。但请记住,自定义分析仪不会在关键字字段上工作。因此,如果您尝试在ES端实现此功能,则无法在不启用字段数据的情况下对该字段进行聚合,应该避免这种情况。我们在最新更新中为标准化者提供了实验性支持,但由于它是实验性的,因此不要在生产中使用它。因此,在我看来,您应该清理代码中的数据。