【问题标题】:Elasticsearch Query Terms Combination OrderElasticsearch 查询词组合顺序
【发布时间】:2015-09-18 19:31:28
【问题描述】:

在elasticsearch中,我搜索一些标签并将它们从最匹配到最不匹配排序。没关系。

但是,我的问题是关于相等匹配情况的顺序。

例如:

  1. 我存储了这些标签:“tag1”、“tag2”、“tag3”、“tag4”、“tag5”
  2. 我存储了这些标签:“tag6”、“tag1”
  3. 我存储了这些标签:“tag4”、“tag3”、“tag1”
  4. 我存储了这些标签:“tag2”、“tag1”、“tag5”、“tag7”

我的搜索查询:

{
    "query" : { 
        "bool" : { 
            "must" : [ 
                { 
                    "terms" : { 
                        "my_field" : ["tag4", "tag6"],
                        minimum_should_match : 1
                    } 
                }, 
                {"term" : {"my_cityId" : 1}}, 
                {"term" : {"my_townId" : 8}} 
            ] 
        } 
    }, 
    "sort" : [ 
        {"_score" : "desc"}, 
        {"my_topTime" : "asc"} 
    ], 
    "from" : 0, 
    "size" : 5 
}

返回:

  1. “tag6”、“tag1”
  2. “tag1”、“tag2”、“tag3”、“tag4”、“tag5”
  3. “tag4”、“tag3”、“tag1”

我的搜索顺序是tag4,然后是tag6。怎么能先返回tag4包含行,后返回tag6?

【问题讨论】:

  • 您在查询中提供的术语顺序与匹配文档的分数无关。在您的案例中,这 3 个文档的顺序完全取决于 "my_topTime" 。
  • 顺便说一下,“my_topTime”字段值都是相等的。可以忽略。

标签: search elasticsearch combinations combinatorics


【解决方案1】:

我从Boosting Filtered Subsets找到了我的问题的解决方案

我使用“function_score”进行过滤查询,并添加了“functions”和“score_mode”。除此之外,我在“函数”中为每个标签指定了“权重”。

查询先返回tag4s,然后tag6包含行:

  1. “tag1”、“tag2”、“tag3”、“tag4”、“tag5”
  2. “tag4”、“tag3”、“tag1”
  3. “tag6”、“tag1”

我的新查询:

{
    "query" : { 
        "function_score" : { 
            "filter" : { 
                "query" : { 
                    "bool" : { 
                        "must" : [
                            { 
                                "terms" : { 
                                    "my_field" : ["tag4", "tag6"],                                          
                                    minimum_should_match : 1
                                } 
                            } , 
                            {"term" : {"my_cityId" : 1}}, 
                            {"term" : {"my_townId" : 8}} 
                        ] 
                    } 
                } 
            }, 
            "functions" : [ 
                {"filter" : {"term" : { "my_field" : "tag4" }}, "weight" : 2},
                {"filter" : { "term" : { "my_field" : "tag6" }}, "weight" : 1} 
            ], 
            "score_mode": "sum" 
        } 
    }, 
    "sort" : [ 
        {"_score" : "desc"}, 
        {"my_topTime" : "asc"} 
    ], 
    "from" : 0, 
    "size" : 5 
}

【讨论】:

    猜你喜欢
    • 2016-03-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-03-13
    • 1970-01-01
    相关资源
    最近更新 更多