2015-02-07 93 views
0

我運行下面的查詢(已縮短爲清楚起見):Elasticsearch:一個布爾下嵌套查詢「應該」沒有返回結果

body : { 
     query : { 
      bool : { 
       must : [ 
        { 
         match : { 
          active : 1 
          } 
         }, 
        ], 
       should : [ 
         { 
         term : { 
          apply : '2' 
          } 
         }, 
         { 
         nested : { 
          path : 'items', 
          query : { 
           terms : { 
            'items.product' : ["1","2"] 
            } 
           } 
          } 
         } 
        ], 
       minimum_should_match : 1 
       } 
      } 
     } 
    }; 

當我運行此查詢,我不拉取回與should子句中的嵌套查詢相匹配的文檔;我只撤回符合第一個條件的文件。我究竟做錯了什麼?爲什麼術語查詢不能針對輸入項數組測試字段並返回結果?

當我將嵌套查詢更改爲match_all或將items.product字段與精確值匹配時,我確實得到了結果。

將嵌套查詢更改爲以下內容而不是當前嵌套查詢(而其他所有內容保持不變)也不會給我帶來任何結果。

nested : { 
     path : 'items', 
     query : { 
      bool : { 
       must : [ 
        { 
         terms : { 
          'items.product' : ["1","2"],    
          minimum_should_match : 1 
          } 
         },       
        ] 
       } 
      } 
     } 

任何幫助將不勝感激 - 這一直讓我瘋狂了幾天吧!

+0

查詢中是否存在任何基於分數執行過濾的內容? – rchang 2015-02-08 20:45:49

+0

不,這是整個查詢。這就是我一度認爲的,但事實並非如此。 – aamirl 2015-02-08 23:43:22

+0

'items.product'字段是否僅包含一個整數(以字符串表示形式),還是字段中還有其他字符數據? – rchang 2015-02-09 15:19:31

回答

2

EDITED包括本terms條件預計非分析場(每文檔here)的索引映射

鑑於討論,我建議你確認你的指數有一個映射,它明確地指定它如此。例如:

{"mappings" : { 
    "your_doc_type" : { 
    "items" : { 
     "type" : "nested", 
     "properties" : { 
     "product" : {"type" : "string", "index" : "not_analyzed"}, 
     ... 
     ... Other properties of the nested object 
     ... 
     } 
    }, 
    ... 
    ... Mappings for the other fields in your document type 
    ... 
    } 
} 

這應該使terms做,他們都應該檢查items.product時候做什麼。

我早懷疑是有別的東西在你的查詢(min_score也許)是基於得分過濾掉的結果,而且門檻淘汰由於匹配items.product條件的文件,但不apply條件潛在的Lucene評分模型。換句話說,如果所有其他事物對於僅滿足should查詢中的一個項目的文檔而言是相等的,那麼滿足"apply":"2"條件的文檔將高於items.product爲1或2的文檔。這是我的經驗觀察,用您的查詢的小測試數據集。

測試數據集:

{"active":1, "apply":"2", "items" : [{"product": "3"}]} 
{"active":0, "apply":"2", "items" : [{"product": "3"}]} 
{"active":1, "apply":"3", "items" : [{"product": "3"}]} 
{"active":1, "apply":"3", "items" : [{"product": "1"}]} 
{"active":1, "apply":"3", "items" : [{"product": "2"}]} 

根據您查詢的條件,我們應該看到三個文件返回 - 第一,第四和第五的文件。

"hits" : [ { 
    "_index" : "test", 
    "_type" : "test", 
    "_id" : "AUtrND1rIJ0nixSnh_cG", 
    "_score" : 0.731233, 
    "_source":{"active":1, "apply":"2", "items" : [{"product": "3"}]} 
}, { 
    "_index" : "test", 
    "_type" : "test", 
    "_id" : "AUtrND1sIJ0nixSnh_cK", 
    "_score" : 0.4601705, 
    "_source":{"active":1, "apply":"3", "items" : [{"product": "2"}]} 
}, { 
    "_index" : "test", 
    "_type" : "test", 
    "_id" : "AUtrND1sIJ0nixSnh_cJ", 
    "_score" : 0.35959372, 
    "_source":{"active":1, "apply":"3", "items" : [{"product": "1"}]} 
} ] 

預期的文件回來,但你可以看到第一個文檔(這apply是2,滿足should查詢的第一準則)得分高得多。

如果您的意圖是針對這些條件不會影響文檔的評分,而是將它們用作簡單的包含/排除條件,則可能需要切換到過濾的查詢。喜歡的東西:

{ 
    "query" : {"filtered" : { 
    "query" : {"match_all" : {}}, 
    "filter" : {"bool" : { 
     "must" : [ 
     {"term" : {"active" : 1}} 
     ], 
     "should" : [ 
     {"term" : {"apply" : "2"}}, 
     {"nested" : { 
      "path": "items", 
      "query" : { 
      "terms" : {"items.product" : ["1", "2"]} 
      } 
     }} 
     ] 
    }} 
    }} 
} 

既然你現在指定的過濾器來代替,這些條件應該不會影響到返回的文檔的得分,而是隻確定文檔是否符合在所有的結果集(當時的計算分數獨立於上述條件)。使用這種過濾查詢,從我啞數據集的結果是:

"hits" : [ { 
    "_index" : "test", 
    "_type" : "test", 
    "_id" : "AUtrND1rIJ0nixSnh_cG", 
    "_score" : 1.0, 
    "_source":{"active":1, "apply":"2", "items" : [{"product": "3"}]} 
}, { 
    "_index" : "test", 
    "_type" : "test", 
    "_id" : "AUtrND1sIJ0nixSnh_cK", 
    "_score" : 1.0, 
    "_source":{"active":1, "apply":"3", "items" : [{"product": "2"}]} 
}, { 
    "_index" : "test", 
    "_type" : "test", 
    "_id" : "AUtrND1sIJ0nixSnh_cJ", 
    "_score" : 1.0, 
    "_source":{"active":1, "apply":"3", "items" : [{"product": "1"}]} 
} ] 

的分數是現在所有相同返回文檔,而無需考慮爲其should的部分很滿意。

請注意,上面的query屬性爲match_all - 如果您的查詢中有其他條件未在原始問題中表示,那麼您需要相應地修改該條款。

+0

實際上,有趣的是,我確實從最初的篩選查詢開始,然後在遇到問題時恢復爲基本查詢。這個解決方案不幸運行,並且讓事情變得更加怪異,當我完全刪除'apply:2'條件(同時離開嵌套條件)時,我根本找不到任何結果。當我在嵌套字段'item.product'上使用匹配查詢來匹配特定的字符串時,它完美地工作。在我看來,術語查詢不起作用。 – aamirl 2015-02-09 00:01:48

+0

@aamirl您是否有爲此索引定義的顯式映射,特別是嵌套對象字段? – rchang 2015-02-09 01:50:08

+0

不,我其實並沒有這樣做,這是我在發帖之前檢查並確定的另一件事;該字段的映射是一個簡單的字符串。正如我之前提到的,在字段上對輸入字符串進行匹配或術語查詢/過濾會導致結果。只有在嘗試使用條件查詢(並傳入數組來比較它)時,它纔會失敗。 =/ – aamirl 2015-02-09 14:33:24