2013-09-25 105 views
2

我比較查詢的結果一樣MATCH AGAINST爲什麼會返回不同於LIKE的結果?

SELECT * FROM object_search 
WHERE 
    keywords LIKE '%,woman,%' 
AND keywords LIKE '%,man,%' 

SELECT * FROM object_search 
WHERE 
    MATCH (keywords) AGAINST ('+(",woman,") +(",man,")') 

我本來期望同樣的結果,但在第一個查詢吐出約300結果,第二個接近3000.

這兩者之間有什麼區別,以及如何使用全文功能獲得相同的結果?

+0

你能否提供你的表格結構?還有一些行在第二種情況下返回,但如果是第一種情況則不行。 –

+0

@AlmaDoMundo看起來'MATCH AGAINST'查詢只需要兩個關鍵字中的一個出現在一行中。它也是一個InnoDB表。 –

+0

我的猜測是,它是關於你的'女人'和'人'字,因爲'男人'是'女人'的子字(但它似乎不是它應該如何工作)。試試類似'foo'和'bar'的方式 - 即不相交 –

回答

1

+運算符用於搜索IN BOOLEAN MODE。我想認爲它將在NATURAL LANGUAGE MODE(默認)中被忽略。

嘗試:

SELECT * FROM object_search 
WHERE MATCH (keywords) 
    AGAINST ('+woman +man' IN BOOLEAN MODE); -- could return rows containing both "man" and "woman" (ignoring ft_min_word_len, see below) 

此外,全文索引將只包括詞。標點符號(如,)將始終被忽略。您不能「全文搜索」非字母數字字符。

最後,默認情況下,忽略短於4個字符的單詞。因此,默認情況下,「man」未被索引。此限制可通過ft_min_word_len配置選項進行更改。

另外,請注意stopwords(從未編入索引的常用詞)。

+0

@Cobra_Fast如果仍有可能,請重新考慮您的表格結構。將彗星分離值(即非標量數據)存儲在單個字段中是不好的做法。如果可以的話,[標準化你的結構](http://en.wikipedia.org/wiki/First_normal_form)。 – RandomSeed

相關問題