如何针对倒排索引和关系数据库优化"文本搜索"?

sha*_*sco 12 architecture search-engine text-search inverted-index

更新2015-10-15

早在2012年,我正在构建个人在线应用程序,并且实际上想要重新发明轮子,因为我天生好奇,出于学习目的并提高我的算法和架构技能.我可以使用apache lucene和其他人,但正如我所提到的,我决定建立自己的迷你搜索引擎.

问:除了使用elasticsearch,lucene等可用服务之外,真的没有办法增强这种架构吗?


原始问题

我正在开发一个Web应用程序,用户在其中搜索特定的标题(例如:book x,book y等),这些数据位于关系数据库(MySQL)中.

我遵循的原则是,从db中获取的每条记录都缓存在内存中,以便应用程序对数据库的调用较少.

我开发了自己的迷你搜索引擎,具有以下架构:
架构图
这是它的工作原理:

  • a)用户搜索记录名称
  • b)系统检查查询开始的字符,检查是否在那里查询:获取记录.如果没有,请添加它并使用两种方式从数据库中获取所有匹配的记录:
    • 在表"查询"(这是一种历史表)中已经存在查询,从而根据ID获得记录(快速性能)
    • 或者,否则使用Mysql LIKE %%语句来获取记录/ ids(同时在历史表查询中保留用户使用的查询以及它映射到的ids).
      - >然后它将记录及其ID添加到 缓存中,并且只将id添加到反向索引映射中.
  • c)将结果返回给UI

系统工作正常,但我有两个主要问题,我找不到一个好的解决方案(过去一个月一直在尝试):

第一个问题:
如果你检查点(B),情况没有查询"历史"被发现,它必须使用像%%声明:此过程变得时间当查询数据库(而不是一个或匹配许多纪录消耗二):

  • 从Mysql获取记录需要一些时间(这就是我在特定列上使用INDEXES的原因)
  • 然后是时间保存查询历史记录
  • 然后是时候将记录/ ID添加到缓存和反向索引映射

第二个问题:
应用程序允许用户添加自己的新记录,这些记录可以立即被登录到应用程序的其他用户使用.
然而,为了实现这一点,必须更新反向索引映射和表"查询",以便在任何旧查询与新单词匹配的情况下.例如,如果添加了记录"woodX",旧的查询"wood"仍会映射到它.所以为了重新勾选查询"wood"到这个新记录,这就是我现在正在做的事情:

  • 新记录"woodX"被添加到"记录"表中
  • 然后我运行一个Like %%语句来查看表"查询"中哪些已存在的查询映射到此记录(例如"wood"),然后将此查询与新记录ID一起添加为新行:[wood,new ID].
  • 然后在内存中,通过将新记录ID添加到此列表来更新反向索引Map的"木"键值(即列表)

- >现在,如果远程用户搜索"wood",它将从内存中获取:wood和woodX

这里的问题也是时间消耗.将所有查询历史(在表查询中)与新添加的单词匹配需要花费大量时间(匹配查询越多,时间越多).然后内存更新也需要很多时间.

什么,我这样做来解决这个问题的时候,就是返回了预期的结果,用户第一,然后让应用程序发布一个AJAX所要求的数据呼叫,实现所有这些更新任务.但我不确定这是一种不良做法还是一种不专业的做事方式?
所以在过去的一个月(多一点)我试着想到这个架构的最佳优化/修改/更新,但我不是文档检索领域的专家(实际上它是我的第一个迷你搜索引擎).

我将非常感谢能够实现这种架构的任何反馈或指导.
提前致谢.

PS:

  • 它是一个使用servlet的j2ee应用程序.
  • 我正在使用MySQL innodb(因此我无法使用全文搜索选项)

ad4*_*d4s 2

我强烈推荐 Sphinx Search Server,它在全文搜索方面得到了最好的优化。访问http://sphinxsearch.com/

它设计用于与 MySQL 一起使用,因此它是您当前工作区的补充。