Elasticsearch:如何将搜索项组合在bool查询中以获得更多相关性

时间:2013-12-06 11:38:31

标签: search elasticsearch

我有一个很好的工作搜索查询,它搜索“fiets”,“reparatie”和两个单词组合。 两个单词的结果应该排名最高,但现在最高的结果是有大量rudy或大量测试的文档....

我理解为什么,但我无法弄清楚如何解决这个问题或找到类似的查询/问题。 不知怎的,我应该对这些块进行分组,但我找不到elasticsearch理解的语法。

另请注意,这是生成的查询,搜索字词的数量可能会有所不同。 (可能不是最有效的查询,因为我是弹性搜索的新手)

{
    "from" : 0, 
    "size" : 10,
    "query" : 
    {
        "bool" : 
        {
            "should" : 
            [
                {"term" : { "beschrijving" : "fiets" }}, 
                {"term" : { "beschrijving_lang" : "fiets" }}, 
                {"term" : { "titel" : "fiets" }}, 
                {"multi_match" : { "query" : "fiets", "fields" : [ "naam", "rubriek", "subrubriek","keywords","zoekkeywords" ]}},

                {"term" : { "beschrijving" : "reparatie" }}, 
                {"term" : { "beschrijving_lang" : "reparatie" }}, 
                {"term" : { "titel" : "reparatie" }}, 
                {"multi_match" : { "query" : "reparatie", "fields" : [ "naam", "rubriek", "subrubriek","keywords","zoekkeywords" ]}},

                {"term" : { "beschrijving" : "fietsreparatie" }}, 
                {"term" : { "beschrijving_lang" : "fietsreparatie" }}, 
                {"term" : { "titel" : "fietsreparatie" }}, 
                {"multi_match" : { "query" : "fietsreparatie", "fields" : [ "naam", "rubriek", "subrubriek","keywords","zoekkeywords" ]}},

                {"term" : { "type" : "3000" }}
            ],
            "must" : 
            [
                {"term" : { "actief" : "1" }}
            ],
            "minimum_number_should_match" : 1
        } 
    },
    "facets" : 
    { 
        "rubriek" : { "terms" : { "field" : "rubriek", "size" : 50 } }, 
        "plaats" : { "terms" : { "field" : "plaats", "size" : 50 } } , 
        "provincie" : { "terms" : { "field" : "provincie", "size" : 50 } } , 
        "gemeente" : { "terms" : { "field" : "gemeente", "size" : 50 } } , 
        "subrubriek" : { "terms" : { "field" : "subrubriek", "size" : 50 } } 
    }
}

使用multi_match改进了一点,因为相同关键字的匹配数量减少而不会丢失结果

{
    "from" : 0, 
    "size" : 10,
    "query" : 
    {
        "bool" : 
        {
            "should" : 
            [
                {"match" : {"naam" : {"query" : "test","operator" : "and"}}}, 
                {"term" : { "beschrijving" : "test" }}, 
                {"term" : { "beschrijving_lang" : "test" }}, 
                {"term" : { "titel" : "test" }}, 
                {"match" : {"rubriek" : {"query" : "test","operator" : "and"}}}, 
                {"match" : {"subrubriek" : {"query" : "test","operator" : "and"}}}, 
                {"match" : {"keywords" : {"query" : "test","operator" : "and"} }}, 
                {"match" : {"zoekkeywords" : {"query" : "test","operator" : "and"} }}, 

                {"match" : {"naam" : {"query" : "rudy","operator" : "and"}}}, 
                {"term" : { "beschrijving" : "rudy" }}, 
                {"term" : { "beschrijving_lang" : "rudy" }}, 
                {"term" : { "titel" : "rudy" }}, 
                {"match" : {"rubriek" : {"query" : "rudy","operator" : "and"}}}, 
                {"match" : {"subrubriek" : {"query" : "rudy","operator" : "and"}}}, 
                {"match" : {"keywords" : {"query" : "rudy","operator" : "and"} }}, 
                {"match" : {"zoekkeywords" : {"query" : "rudy","operator" : "and"} }}, 

                {"match" : {"naam" : {"query" : "testrudy","operator" : "and"}}}, 
                {"term" : { "beschrijving" : "testrudy" }}, 
                {"term" : { "beschrijving_lang" : "testrudy" }}, 
                {"term" : { "titel" : "testrudy" }}, 
                {"match" : {"rubriek" : 
                {"query" : "testrudy","operator" : "and"}}}, 
                {"match" : {"subrubriek" : {"query" : "testrudy","operator" : "and"}}}, 
                {"match" : {"keywords" : {"query" : "testrudy","operator" : "and"} }}, 
                {"match" : {"zoekkeywords" : {"query" : "testrudy","operator" : "and"} }}, 

                {"term" : { "type" : "3000" }}
            ],
            "must" : 
            [
                {"term" : { "actief" : "1" }}
            ],
            "minimum_number_should_match" : 1
        } 
    },
    "facets" : 
    { 
        "rubriek" : { "terms" : { "field" : "rubriek", "size" : 50 } }, 
        "plaats" : { "terms" : { "field" : "plaats", "size" : 50 } } , 
        "provincie" : { "terms" : { "field" : "provincie", "size" : 50 } } , 
        "gemeente" : { "terms" : { "field" : "gemeente", "size" : 50 } } , 
        "subrubriek" : { "terms" : { "field" : "subrubriek", "size" : 50 } } 
    }
}

有什么想法吗?

2 个答案:

答案 0 :(得分:1)

尝试重新安排查询以遵循此模式:

POST /my_index/_search
{
    "query": {
        "bool": {
            "should": [
               { "multi_match": {
                   "query":  "fiets",
                   "fields": [ "beschrijving", "beschrijving_lang", "titel" ]
               }},
               { "multi_match": {
                   "query":  "reparatie",
                   "fields": [ "beschrijving", "beschrijving_lang", "titel" ]
               }},
               { "multi_match": {
                   "query":  "something_else",
                   "fields": [ "beschrijving", "beschrijving_lang", "titel" ]
               }}
            ]
        }
    }
}

只是一个简单的例子,但它显示了整体布局。我们的想法是希望查询“以文字为中心”。对于符合我们更多单词的文档,我们需要更高的分数。 bool自然地将文档评分更高,以满足更多should条款。由于should中的条款正在搜索单个字词,我们可以保证更多的字词==更高的分数。

您甚至可以向minimum_should_match添加bool子句,并强制要求2/3子句必须匹配等。

通过对每个字词使用multi_match查询,我们可以查看多个字段,而不关心术语出现的位置。

这只是一种通用模式,您可以对其进行扩展和修改,但这应该可以帮助您入门。

对于此查询模式

,归功于Clinton Gormley

答案 1 :(得分:0)

您可以使用_score它会根据匹配score对结果进行排序。您的查询将如下所示: -

{
    "from" : 0, 
    "size" : 10,
    "query" : 
    {
    "bool" : 
    {
        "should" : 
        [
    ...........
    .......
    } 
    },
    "facets" : 
    { 
    .....
    },
     "sort": [
      "_score"
   ]
}

reference link