Elasticsearch没有返回多值字段的命中

时间:2015-08-05 16:51:33

标签: solr lucene elasticsearch

我使用的是Elasticsearch,没有任何修改。这意味着映射,规范和analyze / not_analyzed都是默认配置。我有一个非常小的数据集,包含两个项目用于实验目的。这些项目有几个字段,但我只查询一个字段,这是一个多值/字符串数组字段。该文档看起来像这样:

{
   "_index": "index_profile",
   "_type": "items",
   "_id": "ega",
   "_version": 1,
   "found": true,
   "_source": {
      "clicked": [
         "ega"
      ],
      "profile_topics": [
         "Twitter",
         "Entertainment",
         "ESPN",
         "Comedy",
         "University of Rhode Island",
         "Humor",
         "Basketball",
         "Sports",
         "Movies",
         "SnapChat",
         "Celebrities",
         "Rite Aid",
         "Education",
         "Television",
         "Country Music",
         "Seattle",
         "Beer",
         "Hip Hop",
         "Actors",
         "David Cameron",
         ... // other topics
      ],
      "id": "ega"
   }
}

示例查询是:

GET /index_profile/items/_search
{
    "size": 10,
    "query": {
        "bool": {
            "should": [{
                "terms": {
                    "profile_topics": [
                        "Basketball"
                    ]
                }
            }]
        }
    }
}

同样只有两个项目,列出的项目应与查询匹配,因为profile_topics字段与" Basketball"匹配术语。其他项目不匹配。如果我在the should中要求clicked = ega,我只会得到一个结果。

使用Solr我可能会指定字段是多值字符串数组,并且没有规范,也没有分析器,因此profile_topics不会被阻塞或标记化,因为所有值都应该被视为标记(甚至是空格)。不确定这会解决问题,但这是我如何处理Solr上的类似数据。

我认为我已经违反了一些规范/分析器/ TF-IDF问题,如果是这样,我如何解决这个问题,即使有两个项目,查询也会返回ega。如果可能的话,我想解决这个索引或者输入广泛而不是字段特定的。

1 个答案:

答案 0 :(得分:0)

不会分析Basketball中的{p> B(资金terms)。这意味着这是在Elasticsearch索引中搜索它的方式。

你说你有默认值。如果是,则在Basketball字段下编制profile_topics索引意味着索引中的实际字词将为basketball(小写b),这是{{1}的结果分析器。因此,要么将standard设置为profile_topics,要么搜索not_analyzed而不是basketball

关于Basketball,请阅读this

关于将所有字段设置为terms,您可以使用动态模板执行此操作。仍然使用模板,您可以执行Logstash正在执行的操作:为每个not_analyzed字段定义.raw子字段,并且只有此子字段为string。原始/父字段仍然保存相同文本的分析版本,也许您将来会使用分析字段。

看看这个dynamic template。这是Logstash正在使用的那个。

更具体地说:

not_analyzed