【问题标题】:Finding fields Elasticsearch has matched on查找 Elasticsearch 匹配的字段
【发布时间】:2015-04-28 19:11:26
【问题描述】:

我正在使用 Elasticsearch 搜索用户应该加入的组。我将用户数据嵌套到搜索查询中。返回时,我会返回用户应该在的最接近的匹配组。

我正在搜索的字段是一个嵌套字段,如下所示:

`{"interests": [
                {"topics":["python", "stackoverflow", "elasticsearch"]}, 
                {"topics":["arts", "textiles"]}
               ]}`

但是,如果您想了解比赛 - 您如何做到这一点?

Elasticsearch 确实有一个解释功能,它说明使用 tfidf 评分是由什么组成的,但没有具体说明使用了哪些术语。

例如,如果我搜索“Textile”,则文档应该匹配“textiles”。因此,我希望以解释或其他方式返回术语“纺织品”。

我认为满足此需求的唯一方法是存储搜索和检索到的文档,然后处理两者以发现 ES 最有可能匹配的词。

编辑 - 为了更清楚地说明问题

在我的索引中的一个示例,其中包含"interests": ['arts', 'fine arts', 'art painting', 'arts and crafts', 'sports']

现在我的搜索,我正在寻找Arts 和许多其他的东西。现在我正在搜索的术语多次出现在此列表中,因此应该始终是贡献者。

我想要在回复中说这些词与['arts', 'fine arts', 'art painting', 'arts and crafts']以及它们的匹配程度相匹配,即“艺术”应该高于其他词,但所有其他词也是相关的

【问题讨论】:

    标签: elasticsearch


    【解决方案1】:

    Elasticsearch 允许您为所有查询指定 _name 字段,并且 过滤器。这意味着您可以将查询分成不同的部分 单独的名称,这将允许您确定哪些部分匹配。

    例如:

    {
      "query" : {
          "bool" : {
              "should" : [
                  {"match" : { "interests.topics" : {"query" : "python", "_name" : "py-topic"} }},
                  {"match" : { "interests.topics" : {"query" : "arts", "_name" : "arts-topic"} }}
              ]
          }
      }
    }
    

    然后,在您的回复中,您将返回任何查询数组(或 过滤器)匹配,您可以确定 py-topic 查询和/或 arts-topic 上面的查询匹配。

    【讨论】:

    • 谢谢 lee - 你知道这是否适用于嵌套查询吗?我只是在我的身上尝试一下,到目前为止还没有运气
    • @redrubia 它应该适用于嵌套查询,如果您想编辑问题以包含您的映射,我可以尝试给出一个完整的示例。
    猜你喜欢
    • 1970-01-01
    • 2014-06-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多