2015-11-06 52 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