限制在MariaDB(innodb)中的全文搜索

af7jpaap  于 2022-12-23  发布在  其他
关注(0)|答案(1)|浏览(153)

我在快速搜索一个相当大的表(500万个条目)时遇到了麻烦。
这是MariaDB上的一个新数据库(10.4.25)。
my_table的结构如下:
| 身份证|正文|
| - ------| - ------|
| 1个|一些文本|
| 第二章|更多文本|
我现在有一个关于"text"的全文索引,并搜索:
SELECT id FROM my_table WHERE MATCH ('text') AGAINST ("some* tex*" IN BOOLEAN MODE);
这不是超级慢,但可以产生数百万个结果。在我的Java应用程序中检索它们需要很长时间,但我需要匹配的ID。
因此,我想限制的数量已经由我知道只能是相关的id,并尝试这样的东西(id是主索引):
SELECT id FROM my_table WHERE id IN (1,2) AND MATCH ('text') AGAINST ("some* tex*" IN BOOLEAN MODE);
我希望它能先限制在两个id,然后应用全文搜索,并给我两个结果超级快。唉,这不是发生了什么,我不明白为什么。
如果我已经知道一些id,我如何限制查询,使其只搜索这些id,并通过这样做使查询更快?

wz3gfoph

wz3gfoph1#

当您将FULLTEXT(或SPATIAL)索引与一些“常规”索引一起使用时,优化程序假定前者运行得更快,因此它首先这样做。
此外,对表的子集运行MATCH也不是件容易的事(也许是不可能的)。
这两种情况都表明MATCH将首先发生(当然,您希望做相反的事情)。
有解决办法吗?我很怀疑。特别是如果有很多行的单词以“some”或“tex”开头的话。
有一件事要尝试“+":

MATCH ('text') AGAINST ("+some* +tex*" IN BOOLEAN MODE);

请反馈这是否有帮助。
嗯......也许你想

MATCH (`text`)   -- this
MATCH ('text')   -- NOT this

MariaDB中有两个特性:

  • 查询花费的最大时间
  • 最大行数 * 已访问 *(可能不适用于FULLTEXT)

相关问题