2014-10-07 174 views
4

在Elasticsearch,与function_score助推给出的以下文件结构:弹性搜索嵌套性

"workhistory": { 
    "positions": [{ 
    "company": "Some company", 
    "position": "Some Job Title", 
    "start": 1356998400, 
    "end": 34546576576, 
    "description": "", 
    "source": [ 
     "some source", 
     "some other source" 
    ] 
    }, 
    { 
    "company": "Some other company", 
    "position": "Job Title", 
    "start": 1356998400, 
    "end": "", 
    "description": "", 
    "source": [ 
     "some other source" 
    ] 
    }] 
} 

和映射这样的结构:

​​

我希望能够在“企业搜索“并匹配公司的文件=”某公司“等等。然后我想获得tf idf _score。我还想创建一个function_score查询来根据“source”字段数组的值提高此匹配的分数。基本上,如果源包含“某些源”,则用x数量提升_分数。如果需要,我可以更改“源”属性的结构。

这是我走到这一步:

{ 
    "bool": { 
     "should": [ 
     { 
      "filtered": { 
       "query": { 
        "bool": { 
        "should": [ 
         { 
          "bool": { 
           "should": [ 
           { 
            "match": { 
             "workhistory.positions.company.original": "some company" 
            } 
           } 
           ] 
          } 
         } 
        ], 
        "minimum_should_match": "100%" 
        } 
       }, 
       "filter": { 
        "and": [ 
        { 
         "bool": { 
          "should": [ 
           { 
           "term": { 
            "workhistory.positions.company.original": "some company" 
           } 
           } 
          ] 
         } 
        } 
        ] 
       } 
      } 
     }, 
     { 
      "function_score": { 
       "query": { 
        "bool": { 
        "should": [ 
         { 
          "bool": { 
           "should": [ 
           { 
            "match": { 
             "workhistory.positions.company.original": "some company" 
            } 
           } 
           ] 
          } 
         } 
        ], 
        "minimum_should_match": "100%" 
        } 
       }, 
       "filter": { 
        "and": [ 
        { 
         "bool": { 
          "should": [ 
           { 
           "term": { 
            "workhistory.positions.company.original": "some company" 
           } 
           } 
          ] 
         } 
        } 
        ] 
       } 
      } 
     } 
     ] 
    } 
} 

有在这里一些过滤器为好,因为我只想与滤波值返回文档。在这个例子中,过滤器和查询基本上是相同的,但在这个查询的更大版本中,我有一些其他的“可选”匹配来提高可选值等等。现在function_score并没有太多的工作,因为我无法真正地了解如何使用它。目标是能够调整我的应用程序代码中的提升数量并将其传递给搜索查询。

我正在使用Elasticsearch版本1.3.4。

回答

2

我不确定为什么你在那里重复所有的过滤器和查询,说实话。也许我错过了一些东西,但根据你的描述,我相信你所需要的只是一个“function_score”。从documentation

function_score允许您修改查询检索到的文档的得分。

因此,您定义了一个查询(例如 - 匹配公司名称),然后定义一个函数列表,用于提高某个文档子集的_score。从相同的文件:

此外,可以组合几个功能。在这种情况下,可以任意选择适用的功能只有一个文件给定的过​​滤器

所以,你必须看起来对公司具有一定的查询名称相匹配,那么你有一个过滤器的功能操作与过滤器匹配的文档的_score。而在这种情况下,你的过滤器就是应该包含某些东西的“源”。该函数本身是一个脚本:_score + 2。 最终,这将是我的想法:

{ 
     "query": { 
     "bool": { 
      "should": [ 
      { 
       "function_score": { 
       "query": { 
        "bool": { 
        "should": [ 
         { 
         "bool": { 
          "should": [ 
          { 
           "match": { 
           "workhistory.positions.company.original": "some company" 
           } 
          } 
          ] 
         } 
         } 
        ], 
        "minimum_should_match": "100%" 
        } 
       }, 
       "functions": [ 
        { 
        "filter": { 
         "nested": { 
         "path": "workhistory.positions", 
         "query": { 
          "bool": { 
          "should": [ 
           { 
           "match": { 
            "workhistory.positions.source": "some source" 
           } 
           } 
          ] 
          } 
         } 
         } 
        }, 
        "script_score": { 
        "script": "_score + 2" 
       } 
       }, 
       { 
       "filter": { 
        "nested": { 
        "path": "workhistory.positions", 
        "query": { 
         "bool": { 
         "should": [ 
          { 
          "match": { 
           "workhistory.positions.source": "xxx" 
          } 
          } 
         ] 
         } 
        } 
        } 
       }, 
       "script_score": { 
        "script": "_score + 4" 
       } 
       } 
      ], 
      "max_boost": 5, 
      "score_mode": "sum", 
      "boost_mode": "sum" 
      } 
     } 
     ] 
    } 
    } 
} 
+0

这似乎是工作,我切换出的脚本是在脚本的脚本文件夹来无法启用动态脚本。我快到了,但是我需要先对普通查询进行评分,然后应用此查询来提高我的function_score查询的分数。因此,结果将首先对文档中的匹配进行排序,然后通过此功能进行提升。 – 2014-10-08 05:10:02

+0

我也不知道如何应用不同的提升,如果源被命名为别的东西,或根本不存在。这会匹配相同的嵌套元素,还是该数组中的任何元素? – 2014-10-08 05:13:44

+0

对另一个“源”值的不同提升很简单:您只需定义另一组“{”filter“:{},”script_score“:{}}'。我更新了我的答案。 – 2014-10-08 05:27:52