2016-07-24 69 views
1

我是新與彈性的搜索,但現在已坐這個問題了一會兒:彈性搜索QUERY_STRING包括術語不查詢

我試圖做到的,是用大量的分組複選框過濾的搜索(即動態提取),如組:

  • 級(8-12),
  • 具有獨特的ID(很多人),元數據標籤,
  • 教學大綱(目前只有兩個),
  • 年等

的代碼我現在有(不是所有的領域包括尚未):

$query = Contribute::searchByQuery(["query"=> ["query_string"=> ["query"=> "(grade=>'12' OR '10') AND (syllabus=>'IEB') AND (meta_data=>'1')"]]], null, null, $paginate, $page); 

我遇到的問題,然而,就是這個會,例如,匹配的行用以下值:

  • ID == 1(從meta_data => 1 ???),大綱== IEB(足夠公平),等級== 11,meta_data == 1(公平(爲什麼?)足夠)
  • id == 17,syllabus == IEB(足夠公平),g RADE == 9(原因),meta_data == 3(爲什麼?)
  • 然後將所有正確的行似乎被包括以及

的溶液(這是不可行的,因爲元數據可以擴大成千上萬的唯一的ID)不加入到所有其他現有條款:

$query = Contribute::searchByQuery(["query"=> ["query_string"=> ["query"=> "(grade=>'12' OR '10' NOT '8' NOT '9' NOT '11') AND (syllabus=>'IEB' NOT 'DOE') AND (meta_data=>'1' NOT '2' NOT '3' NOT '4' etc etc etc.)"]]], null, null, $paginate, $page); 

所以現在的問題是,我該如何排除任何條件,不指定,默認情況下?目前他們只是包括自己。以比第二段代碼更簡單的方式,我必須明確地添加我不想要的內容。

順便說一句,我從用戶選擇建立這些查詢,所以它不像這些例子中的靜態。另外,我發現做一個數據庫檢查來查看沒有包含哪些術語,並將其添加到查詢中是毫無意義的。 Elastic搜索的重點不在於避免執行db查詢嗎?

回答

1

您正在將您的PHP代碼的語法=>與Lucene query string syntax混合。

(grade=>'12' OR '10') AND (syllabus=>'IEB') AND (meta_data=>'1') 

應改爲:

(grade:12 OR grade:10) AND (syllabus:IEB) AND (meta_data:1) 

請注意,我去掉不必要的引號(他們真的只是一般在必要的時候,你有空格),並與:更換=>。我還修復了grade=>'12' OR '10'以正確查看評分。沒有它,'10'沒有與之相關的領域,因此將看_all field好像它是這樣的:

(grade:12 OR _all:10) AND (syllabus:IEB) AND (meta_data:1) 
+0

太感謝了,現在工作正常:d。 最初我刪除了引號,但在時間上添加了它作爲解決問題的嘗試。也有(等級=> 12或等級=> 10),但與(等級=>'12'或'10')相比沒有差別,但整個問題似乎來自混亂:與=>,如你所說。發生這種情況是因爲我剛剛看到了有關expect =的一般錯誤,而不是:對於其他部分。 – SwCharlie