【问题标题】:Elasticsearch: filter by any fieldElasticsearch:按任何字段过滤
【发布时间】:2015-11-28 01:54:15
【问题描述】:

我正在使用 elasticsearch 中的过滤器(我们使用旧版本 1.3.1),我需要按任何字段过滤我的搜索结果。通过查询,可以这样完成:

"query": {
  "query_string": {
    "query": "_all:test"
  }
}

但过滤器似乎不适用于 _all 语句。我能做些什么?更新的 elasticsearch 版本会解决我的问题吗?

提前致谢!

PS:我需要搜索确切的值,所以我不能使用查询。查询和过滤器之间存在差异 - 如果您搜索 my brown,那么您会看到如下结果:

my brown

This is my brown dog.

someone stolen my brown wallet

但是过滤器只会返回my brown,这正是我所需要的。

【问题讨论】:

    标签: elasticsearch


    【解决方案1】:

    您可能想了解一下queries and filters 之间的区别。你在那里做的是query string query

    如果您确实想过滤确切的文本标记(如果您不知道“标记”是什么意思,请阅读 analysis),并且您已设置映射以使 "_all" field 的行为正如你所期待的那样尝试这样的事情:

    POST /test_index/_search
    {
       "query": {
          "filtered": {
             "filter": {
                "term": {
                   "_all": "test"
                }
             }
          }
       }
    }
    

    另一方面,如果您想要进行一些分析(例如,"Test" 被标记为 "test"),您可能想要这样:

    POST /test_index/_search
    {
       "query": {
          "match": {
             "_all": "Test"
          }
       }
    }
    

    这是我用来玩它的一些代码:

    http://sense.qbox.io/gist/44adf2c2ade8abd6758f0e08ed2e40434850fc1c

    【讨论】:

    • 感谢您的建议。但是 _all 字段文档说它是已分析字段,这对我不利,因为恕我直言,过滤器仅适用于 not_analyzed 字段。而且我不能使用匹配查询,因为它不会返回真正准确的结果 - 找到的字符串不一定与给定的搜索表达式相同。
    • 明白了。您的问题对所有这些限制都不是很清楚。一方面,您可以在_all 字段上设置分析器;这是一个使用空格标记器的example(听起来这可能是您的用例的正确选择)。您还可以使用here 所述的自定义“全部”字段。
    • 这正是我不想要的——当我搜索“Test”时,结果是正确的,因为只返回 field2 =“Test”的记录。当我搜索“测试”时,弹性返回记录,字段 2 =“这是一个测试”,这是不对的,因为字符串不完全相同。我需要带有 _all 字段的非常准确的搜索结果。
    • _all 字段的精确匹配没有多大意义,因为它是来自多个不同字段的值的串联(这可能是无法设置 "index": "not_analyzed" 的原因_all);目前尚不清楚这些字段将如何连接,因此即使您知道输入值,您也可能无法预测 _all 字段的确切未分析值。无论如何,听起来您应该为您的用例创建一个自定义字段,如我上面提供的链接中所述。
    • “没有多大意义,因为它是值的串联”我同意,我昨天也意识到了这一点。我换个方式,谢谢。 :-)
    猜你喜欢
    • 2021-10-15
    • 1970-01-01
    • 2015-07-23
    • 2014-11-17
    • 2016-04-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多