【问题标题】:Elasticsearch Filtering on fields within a listElasticsearch 过滤列表中的字段
【发布时间】:2013-10-26 08:55:52
【问题描述】:

我在筛选 Elastic Search 列表中的字段时遇到问题。我正在索引简单的 JSON 对象以进行搜索和过滤。

被索引的示例对象是:

{ 
    "id" : 1,
    "name" : "My Inventory",
    "description" : "This is a piece of inventory.",
    "sizes" : [ "big", "small" ],
    "geos" : [ { "country" : "US", "fullName" : "United States" } ]
}

我可以很容易地按 id、名称、描述和大小进行过滤,但是在尝试按地理位置进行过滤时,我遇到了障碍。下面是我尝试使用的过滤器。我将不胜感激任何让我朝着正确方向前进的指针。谢谢!

curl -XPOST 'localhost:9200/stuff/inventory/_search?pretty=true' -d '
    {
        "fields" : [ "name" ],
        "filter" : {
            "terms" : { "geos.country" : [ "US" ] }
        }
    }
'

【问题讨论】:

  • 你得到了什么?如果问题是您得到 0 个结果,那可能是因为您索引小写?试试“我们”。或者,如果您使用默认映射“我们”是一个停用词,因此它根本不会被索引。
  • @javanna 你是对的。我只是对除我正在排序的字段之外的所有字段使用默认索引,但使用小写字母有效。

标签: list search filter elasticsearch


【解决方案1】:

默认情况下,会分析字符串字段(“分解为可搜索的术语”是Elasticsearch docs 的描述方式)。这不适用于术语过滤器,因为术语过滤器会进行精确匹配,但该字段将包含可能更改的版本。

您可以通过在映射中设置 "index" : "not_analyzed" 来告诉 Elasticsearch 不要这样做。您的 geos 字段映射应如下所示

"geos" : { 
    "type" : "object",
    "properties" : {
        "country" : { "type" : "string", "index" : "not_analyzed" },
        "fullName" : { "type" : "string" } 
    } 
}

您可能还想将 fullName 设置为 not_analyzed,具体取决于您将如何使用它。如果您想将其与术语查询或过滤器一起使用,则不应对其进行分析;如果要进行模糊匹配、拼写校正等,应该进行分析。

【讨论】:

  • 谢谢。由于国家/地区代码只是一个单词,因此我可以将术语过滤器小写。如果我尝试对 fullName 字段或其他使用多个术语的字段进行术语过滤,此信息肯定会有所帮助。
  • 为什么默认分析器不起作用?是因为国家字段是 2 个字符,还是停用词。我不太清楚为什么默认分析器没有索引术语“美国”。
猜你喜欢
  • 2021-10-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-08-27
  • 2021-07-23
  • 2019-06-28
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多