2014-12-04 151 views
1

我有配料表。我想要所有那些有某些成分的食譜。以下是我的表格結構。Mysql全文索引搜索返回奇怪的結果

Table(ingredient) - Applied fulltext index on ingredient column. 
------------------------------------------------------ 
ingredientID rcteID ingredient 
    310   1  Mint Leaves  
    311   1  Corriender Leaves 
    312   1  GreenChili 

我想獲取全文搜索查詢下面的以上記錄,但沒有得到該記錄。

SELECT `Ingredient`.`ingredientID` , `Ingredient`.`rcteID` 
FROM `ingredient` AS `Ingredient` 
WHERE MATCH (`Ingredient`.`ingredient`) 
     AGAINST ('+Mint Leaves +Corriender Leaves +Greenchili' IN BOOLEAN MODE) 
AND `Ingredient`.`rcteID` 
IN (1) 
GROUP BY `Ingredient`.`rcteID` 

爲什麼上面的查詢不能用於上述記錄?

當我試着下面的查詢它的工作。只是改變了搜索文本。

SELECT `Ingredient`.`ingredientID` , `Ingredient`.`rcteID` 
FROM `ingredient` AS `Ingredient` 
WHERE MATCH (`Ingredient`.`ingredient`) 
     AGAINST ('+Greenchili +Mint Leaves +Corriender Leaves' IN BOOLEAN MODE) 
AND `Ingredient`.`rcteID` 
IN (1) 
GROUP BY `Ingredient`.`rcteID` 

OUTPUT 
-------------------- 
ingredientID rcteID 
311    1 

不明白髮生了什麼事。爲什麼第一個查詢不返回任何結果而在查詢下面返回結果?

+0

那麼哪些記錄來自那些你想返回的第一個查詢以及哪些記錄實際返回? – Mihai 2014-12-04 12:33:14

+0

剛剛編輯我的問題。你可以看到我得到的輸出。 – Jimit 2014-12-04 12:35:20

回答

0

這不是一個真正的解釋,但您可以運行此查詢來查看分數。

SELECT MATCH (`Ingredient`.`ingredient`) 
     AGAINST ('+Mint Leaves +Corriender Leaves +Greenchili' IN BOOLEAN MODE) 
FROM `ingredient` AS `Ingredient` 
WHERE MATCH (`Ingredient`.`ingredient`) 
     AGAINST ('+Mint Leaves +Corriender Leaves +Greenchili' IN BOOLEAN MODE) 

我相信,您的查詢的意思:找到的成分,他們每個人都包含這些薄荷葉,葉Corriender,Greenchili,以及其中全部沒有在您的數據集中發現。 MySQL找不到包含上述所有關鍵字的行。

但是,如果你,但你的查詢到括號,這是一個不同的故事:

SELECT `Ingredient`.`ingredientID` , `Ingredient`.`rcteID` 
FROM `ingredient` AS `Ingredient` 
WHERE MATCH (`Ingredient`.`ingredient`) 
     AGAINST ('(+Greenchili) (+Mint Leaves) (+Corriender Leaves)' IN BOOLEAN MODE) 
AND `Ingredient`.`rcteID` 
IN (1) 
GROUP BY `Ingredient`.`rcteID` 

這種查詢可以被翻譯成:取我的成分含有這些的至少一個:薄荷葉, Corriender葉子,Greenchili並通過rcteID對它們進行分組。

更新:

SELECT t1.rcteID FROM `ingredient` t1 
    JOIN `ingredient` t2 ON t2.rcteID = t1.rcteID 
    JOIN `ingredient` t3 ON t3.rcteID = t2.rcteID 
WHERE 
    MATCH (t1.`ingredient`) AGAINST ('+Greenchili' IN BOOLEAN MODE) 
AND 
    MATCH (t2.`ingredient`) AGAINST ('+Mint Leaves' IN BOOLEAN MODE) 
AND 
    MATCH (t3.`ingredient`) AGAINST ('+Corriender Leaves' IN BOOLEAN MODE) 
AND t1.`rcteID` IN (1) 
GROUP BY t1.`rcteID` 

我覺得這個查詢會爲你工作。基本上,它與你有相同的想法,但它會分別查找3個關鍵字,只能得到包含3個成分的rcteID。

+0

我希望那些包含所有這3種成分的rcteID至少沒有一個。你能指導我怎麼寫這個查詢? – Jimit 2014-12-05 10:10:26

+0

你可以在更新的部分嘗試我的查詢。 – hungneox 2014-12-05 10:28:12

+0

似乎,這不是有效的方式,因爲我們需要加入表格的次數與我的關鍵字一樣多。 – Jimit 2014-12-05 11:24:12