2014-03-19 66 views
2

我試圖使用elasticsearch一次查找多個術語。如何使用elasticsearch一次搜索2個字符串?

更具體地說,當用戶輸入搜索詞如「quake 2」時,我想彈性搜索匹配「quake 2」和「quake ii」。因此,如果遊戲以羅馬數字存儲在系統中,結果將與結果相符。

我將使用PHP來檢測搜索詞中是否存在整數,然後生成與羅馬數字相對應的內容,這應該是直接的,所以我沒有尋求幫助。

這是當我用磚塊牆撞擊到使用elasticsearch的同時查詢兩個字符串的時候。

這裏是什麼,我已經試過一個例子:

$json = '{ 
      "query" : { 
        "terms" : { 
         "title" : [ "quake", "crysis" ], 
         "minimum_should_match" : 1 
        } 
       } 
      } 
     }'; 
$searchParams['index'] = 'thegamesdb'; 
$searchParams['type'] = 'game'; 
$searchParams['body'] = $json; 
$elasticResults = $client->search($searchParams); 

上述行爲與預期相同,並返回結果,其中包括地震和光環,具有相當穩健seaach分數爲每個列表。

但是,當我嘗試使用上述查詢來同時搜索「quake 2」和「quake ii」時,我完全沒有點擊?事實上,我已經確定,它似乎是包含標題和數字之間的空格,這會導致彈性搜索關閉。

$json = '{ 
      "query" : { 
        "terms" : { 
         "title" : [ "quake 2", "quake ii" ], 
         "minimum_should_match" : 1 
        } 
       } 
      } 
     }'; 

如果在「條款」查詢中不允許有空格,那麼我應該如何執行這種類型的搜索?

回答

2

將查詢拆分爲two.use bool查詢應調整並匹配查詢以獲得適當的結果。 匹配查詢的工作原理是匹配查詢由ES再次分析和構建。

 { 
    "query": { 
     "bool": { 
      "must": [ 
       { 
        "match": { 
         "title": "quake 2" 
        } 
       }, 
       { 
       "match": { 
        "title": "quake ii" 
       } 
       } 
      ] 
     } 
     } 
    } 

我試過了..它的工作.. HOpe它幫助..!

+0

效果很好!感謝你的回答! 它在我的遊戲db中發現了281個命中,其中只有9個適合返回,其中7個都是地震的匹配,其中前兩個是「quake ii」的精確匹配,但它確實返回了以下內容最後兩個:「Raiden II」和「Driver 2」。 我試着將「應該」更改爲「必須」,並且我得到了與上面完全相同的最後2場比賽沒有包含地震這個詞。 所以我認爲我的目的,我會用你的答案,但與「必須」,而不是「應」。 非常感謝代碼! +1 – flexage

2

您是否嘗試過使用

"terms" : { 
    "title" : [ "quake", "2", "ii" ], 
    "minimum_should_match" : 2 
} 

或者是作爲一個有點幼稚?

+1

這工作得很好,並提供了一個更精確的結果集接受的答案,只給我2精確匹配,這是很好的。但是,這需要我手動將搜索詞分解爲單個詞的數組,並在最後添加整數和羅馬數字,然後必須計算出與我自己相匹配的最小值,這可能不太理想。 一個很好的答案,但我會保持它的揹負。 感謝您的答案,但! – flexage

相關問題