2013-05-01 102 views
0

我正在對名稱可能出現的多個字段的文檔進行名稱查詢。在許多情況下,每個文檔節點的名稱都是相同的。但是,在某些情況下,可能會有所不同。我想在最高匹配的字段/節點上評分我的查詢。Elasticsearch從字段組中獲得最高分數

因此,假設我有以下索引的文件。

{ 
    "id" : 1, 
    {"object1": {"name" : 'Todd Hughes'}}, 
    {"object2": {"name" : 'Todd Hughes'}}, 
    {"object3": {"name" : 'Todd Hughes'}} 
} 

{ 
    "id" : 2, 
    {"object1": {"name" : 'Todd Hunt'}}, 
    {"object2": {"name" : 'Todd Hunt'}}, 
    {"object3": {"name" : 'Ken Collins'}} 
} 

{ 
    "id" : 3, 
    {"object1": {"name" : 'Todd Huddle'}}, 
    {"object2": {"name" : 'Todd Huddle'}}, 
    {"object3": {"name" : 'Todd Huddle'}} 
} 

我想能夠搜索「託德亨特」,並與2「ID」先拿到第二個記錄。我的問題是這些字段是用ngram建立索引的,其他文檔#1和#3部分匹配,並且每個對象節點/字段的總和相加。所以這對我不起作用。

"bool" : { 
    "should" : [ 
    {:field : {"object1.name" : "Todd Hunt"}}, 
    {:field : {"object2.name" : "Todd Hunt"}}, 
    {:field : {"object3.name" : "Todd Hunt"}} 
    ], 
    "minimum_number_should_match" : 1 
} 

我已經嘗試閱讀自定義得分和排名,我的頭只是旋轉。關於如何構建查詢的任何想法,以便每個對象1,對象2或對象3的最高等級是最終得分?

回答

3

可以使用Dis Max query

產生由其子查詢產生的文件的聯合查詢,以及分數每個文檔的最大得分爲任何子查詢產生的文件,再加上一個平局決勝增加任何額外的匹配子查詢

考慮到每個子查詢將是一個不同領域的查詢,你會得到所需的行爲。

您可以選擇使用聯合斷路器爲在多個字段中具有匹配的文檔「提供更多得分」。

+0

謝謝,我昨晚找到了。這是我的查詢結果如何。 https://gist.github.com/metaskills/5501600 – MetaSkills 2013-05-02 11:23:28

相關問題