2015-10-12 86 views
2

我有這樣的查詢:等效搜索

SELECT * FROM table WHERE col LIKE '%word' 

現在什麼是全文上述查詢其相當於索引?

應當指出的是,這樣做筆記的工作:

SELECT * FROM table WHERE MATCH(col) AGAINST('+word' IN BOOLEAN MODE) 

編輯

我想這句話,選擇 '測試':

它是一個t檢驗。

+1

沒有等價物。我不認爲MySQL允許相對於文檔的開始和結束的定位信息。你可以做的最好的事情就是使用'match()'後跟一個'like'。 –

回答

0

我不認爲MySQL直接支持這一點。

SELECT t.* 
FROM (SELECT * 
     FROM table 
     WHERE MATCH(col) AGAINST('+word' IN BOOLEAN MODE) 
    ) t 
WHERE col LIKE '%word'; 

(我不是100%肯定的子查詢需要)

如果你知道,這將是搜索的一個常見的類型,你可以破解:您可以通過執行加快查詢一個辦法。修改每個文件是這樣的:

BEGINDOCMARKER blah blah blah ENDDOCMARKER 

然後你可以搜索:

SELECT * 
FROM table 
WHERE MATCH(col) AGAINST('"word ENDDOCMARKER"' IN BOOLEAN MODE) 

如果你採取這種方法,要小心標記。使用^$(ala正則表達式)是誘人的,但由於最小的字長和其他原因,這些將被取消索引。一些不尋常的人物混亂是一個很好的選擇。

另請注意,這會使文本變得更長,並且您可能希望爲演示目的刪除這些文字。如果空間不是問題,則複製該字段,一個用於搜索,另一個用於呈現。這可以用於另一個原因:處理同義詞。或者,考慮其他文本搜索選擇。其他工具確實允許在查詢中定位信息。

+0

其實你的第一個查詢是錯誤的,因爲'MATCH()'無法找到我想要的*(然後通過'LIKE()'在'MATCH()'的結果中搜索無用)*。另外你的第二個查詢是徒勞的,因爲我可以用這樣的明星來做到這一點:'AGAINST('word'* BOOLEAN MODE)''。實際上我的問題是關於前綴(不是後綴),我的意思是我需要在「ttest」中選擇「test」或者在「hello」中使用MATCH()來選擇「ello」。可能嗎? – stack