2013-08-28 57 views
18

elasticsearch有没有一种方法来提高出现在文档中的确切短语的重要性?elasticsearch增强精确词组匹配的重要性

例如,如果我正在搜索短语“网络开发人员”,并且“网络开发人员”这两个词出现在一起,那么与在整个文档中分别出现的“网络”和“开发人员”相比,他们会增加5。因此,任何包含“网络开发人员”的文档将在结果中首先出现。

回答

24

您可以使用bool query将不同的查询组合在一起,您也可以对它们进行不同的提升。假设您对这两个术语都有一个常规的match query,而不管它们的位置如何,然后是一个带有较高提升的短语查询。

像下面的内容:

{ 
    "query": { 
    "bool": { 
     "should": [ 
     { 
      "match": { 
      "field": "web developer" 
      } 
     }, 
     { 
      "match_phrase": { 
      "field": "web developer", 
      "boost": 5 
      } 
     } 
     ], 
     "minimum_number_should_match": 1 
    } 
    } 
} 
+1

但会发生什么,当我想在多个指标和不同的字段集合进行这样的查询?据我所知match_phrase只适用于特定的字段名称。在我的情况下,我需要(一般来说)使用类似于“{”query_string“:{”query“:”我的确切短语“,”fields“:[”typeA.fieldA“,”typeB.fieldB“]}}' – leandroico

7

作为替代javanna的回答,你可以做一个bool查询中与mustshould条款类似的东西:

{ 
    "query": { 
    "bool": { 
     "must": { 
      "match": { 
      "field": "web developer", 
      "operator": "and" 
      } 
     }, 
     "should": { 
      "match_phrase": { 
      "field": "web developer" 
      } 
     } 
    } 
    } 
} 

未测试,但我相信这里的must子句将匹配包含的结果'web'和'devel操作符“和should子句将得分更高的匹配”Web开发者“的短语。

+0

是的,这确实与其中的web开发者的文档具有更高的相关性,但OP想要控制相对重要性(使用数字“5”)。例如,也许在极少数情况下,一个带有大量令牌'web'和'developer'的文档可能会用一个'web开发人员'击败一个文档。 有了这个答案,你同样重视这两个查询([ref](https://www.elastic.co/guide/en/elasticsearch/guide/current/bool-query.html#_score_calculation))。 – Garrett

1

我使用下面的示例查询在我的情况正在工作。它带来了精确+模糊的结果,但确切的结果会被提升!

{ "query": { 
"bool": { 
    "should": [ 
    { 
     "match": { 
     "name": "pala" 
     } 
    }, 
    { 
     "fuzzy": { 
     "name": "pala" 
     } 
    } 
    ] 
}}} 
0

我认为它的默认行为已经与匹配查询“或”运算符。它会首先过滤短语“web开发者”,然后再使用术语“web”或“develeper”。虽然你可以使用上面的答案来提高你的查询。如我错了请纠正我。