2016-04-01 49 views
1

我試圖複製以下LIKE查詢使用全文搜索JSON數據;MySQL全文搜索JSON數據

SELECT * FROM table 
    WHERE response LIKE '%"prod_id": "foo"%' 
    AND response LIKE '%"start_date": "2016-07-13"%' 

在我的數據庫上面的查詢返回28行

這是我的嘗試:

SELECT * FROM table 
    WHERE MATCH(response) 
    AGAINST('+"\"prod_id\": \"foo\"",+"\"start_date\": \"2016-07-13\""') 

然而,這將返回4500行(與運行第一個查詢只爲prod_id〜1,900行當在日期上運行第一個查詢時)

這是我的理解,+"text here"將指示需要字,並且字面雙引號(存在於JSON數據中)應該被轉義,並且該,將指示我正在查找的兩個字符串之間的分隔。我不正確的理解是什麼?無論如何,將它作爲全文查詢運行是否有意義?

+2

我認爲你忘了加上[IN BOOLEAN MODE](https://dev.mysql.com/doc/refman /5.5/en/fulltext-boolean.html)修飾符來激活這些布爾運算符。默認修飾符是[IN NATURAL LANGUAGE MODE](http://dev.mysql.com/doc/refman/5.7/en/fulltext-natural-language.html),它不適合您的需要。 – Sevle

+1

謝謝@Sevle當然是問題的一半 - 我需要的調整的其餘部分在下面。 – Novocaine

回答

1

感謝@Sevle我調整了我的查詢,就像這樣,它返回正確的結果;

SELECT * FROM table 
    WHERE MATCH(response) 
    AGAINST('+\"prod_id: foo\" +\"start_date: 2016-07-13\"' IN BOOLEAN MODE) 

逗號沒有幫助,我是逃脫字符錯誤,當然我也需要IN BOOLEAN MODE添加。最後,我刪除了我在JSON字符串中搜索的雙引號。

也可能值得注意的是,因爲我使用PHP PDO來運行此查詢,我還不得不作出以下調整。

而不是構建查詢,就像試圖像我通常會綁定變量一樣;

$query = $db->prepare('...AGAINST('+\"prod_id: :prod_id\" +\"start_date: :start_date\"'); 
$query->execute(array('prod_id' => 'foo', 'start_date' => '2016-07-13')); 

我不得不這樣做,因爲我發現I could not bind variables in full test searches

$sql_against = $db->quote('...AGAINST('+\"prod_id: foo\" +\"start_date: 2016-07-13\"'); 
$query = $db->prepare("...AGAINST($sql_against IN BOOLEAN MODE)")