2015-11-06 40 views
0

因此,我檢查了多個關於MySQL全文搜索的多個待定聯合表。我現在知道,這是不可能的,因爲索引不能在聯合表上進行。給定的解決方案總是與兩個「匹配」和/或 - 但它不能解決我的問題。在多個表上的MySQL全文搜索 - 另一個

情況如下。我得到了:
- 一個「作品」表,其中包含書名,簡短描述和文字摘錄。
- 「作者」表,作者姓名。

由於某些原因,我必須在布爾模式下進行搜索。此外,在搜索字段中輸入的單詞的默認行爲是AND(我通過用+替換空格來預處理請求)。

用戶通常會在搜索字段中輸入:「NameOfAuthor TitleOfTheBook」或「NameOfAuthor aRandomWord(他在摘錄中查找)」或「TitleOfTheBook」。他希望只找出匹配他輸入的所有單詞的結果(以及所有這些結果)。

所以如果我:
- 匹配「作品」字段或「作者」字段,只有在「作品」表中的簡短描述提及作者姓名時,我纔會有答案。
如果我不預處理查詢(如果我沒有將「NameOfAuthor TitleOfTheBook」轉換爲「+ NameOfAuthor + TitleOfTheBook」),我將擁有來自一位作者的所有書籍以及包含查詢字詞的所有書籍,這是不適合的。

- 匹配「作品」字段和「作者」字段,我什麼也沒有。如果我不預處理針對「與作者匹配」部分的查詢,則可能在此情況下起作用,但通常不起作用,因爲它不適用於任何未提及作者姓名的搜索。

在我看來,唯一的解決方案是一個將混合作品字段和作者姓名的索引。但是不可能爲聯合做一個索引......情況似乎很典型,我不能相信這是一個真正的問題。所以我可能很愚蠢,但我無法解決問題。任何想法 ?我必須爲此搜索創建特定的虛擬表嗎?

非常感謝!

回答

0

嗯,寫下這個問題幫助我找到了一些東西......這個想法是將用戶輸入壓縮成一個$ wordsArray並對它們中的每一個進行全文搜索。

所以,想法是:

//Parse the words from the query field 
    for (there is still a $word to check in the $wordsArray) { 
     // do a fulltext search on "works" fields against $word OR "authors" fields against $word 
     // save the results in a multi-dimensional $resultArray 
    } 

// Keep only the results that exists in every row of the $resultArray 
// Display 

我認爲這是相當沉重的,雖然......但是我能想象的唯一選擇是與它索引的搜索目的的數據庫預生成表。這一切都取決於規模。

除非其他人有更好的解決方案!

+0

另外還有一點:我不明白MySQL爲什麼不實現SQLite系統:虛擬表可以是任何你想要的聯合,可以按照你想要的方式進行詢問......這就是它應該如何是。但也許我錯過了什麼? – DonRamiro