sql-server - ERP 应用程序中的全文搜索 - Apache Lucene\Solr 是正确的选择吗?
问题描述
我目前正在研究向我们的 ERP SAAS 应用程序添加快速全文搜索所需的工具,目的是在应用程序中提供单个搜索入口点,该入口点可以搜索构成软件领域的许多不同类型的对象。
</p>
该应用程序(一个 Spring Java Web 应用程序)由一个Sql Server RDBMS(使用Hibernate作为 ORM)支持,有数百个不同的表,其中几十个(但可能更多)应该是可搜索的(通常有一个或多个 varchar 列在应该被索引/搜索的evenry表中)。
以一个搜索栏为例,我可以在其中搜索客户、合同、员工、文章......),这些数据也经常更新(新插入、删除、更新......)
</p>
我发现这篇文章 (www.chrisumbel.com/article/lucene_solr_sql_server) 展示了如何将 Sql Server 数据库与 Solr 连接,在数据库上发布了一个查询示例,该示例提取了 Solr 在数据导入期间使用的数据。
由于我们有几十个(甚至更多)包含可搜索数据的表,这意味着我们应该通过第一步,将提取此数据的所有 sql 查询与 Solr 集成,以便构建索引?
第二个问题:并非所有人都可以搜索所有数据(权限和临时过滤器),所以我们如何补充 Solr 提供的全文搜索,需要放置更复杂的查询(例如加入其他表)这个数据?
</p>
谢谢
解决方案
您几乎要求一个完整的咨询项目:-) 但是一些建议是可能的。
定义搜索结果类型:搜索引擎使用非规范化数据,即在查询时您不会进行任何联接(如果您认为这样做,请坚持使用您的数据库:-)这意味着您需要在填充索引时进行必要的联接。这定义了您可以搜索的内容。大多数人“只是”索引文档或日志行,因此只有一种类型的结果。有时会包括人们的个人资料,有时会在来自不同源系统的结果之间产生差异,但最终,搜索结果类型的数量是有限的。更重要的是,它们仍然被索引到一个相同的模式中(其中模式对于搜索引擎来说非常具有可塑性)。
索引:你知道你的 SQL 语句来提取你的数据。转换为 JSON 并将其放入搜索引擎并不困难。需要注意的一件事:当您的数据库发生变化时,您会继续索引、增量或完全“爬行”,这取决于您要添加多少逻辑。最棘手的部分是将数据库端的删除操作放入索引中。如果它消失了,它就消失了:你怎么知道有一些东西需要从索引中清除:-)
安全搜索由于您并没有真正加入,因此在查询时间量应用访问权限需要两个步骤。在索引期间,写下可能阅读您的搜索结果的人的原则(组,用户)名称。在查询时,获取用户 ID 并递归展开,以获取用户的所有组。将此添加为查询过滤器。确保为所有用户定期缓存过滤器甚至预先计算并将其存储在快速存储中(搜索索引是一个地方,DB 也会这样做:-) 显然,如果访问权限发生变化,您需要重新索引。好消息是:只要事情只是在 LDAP/AD 中发生变化,您就不需要索引数据,只需扩展受影响用户的组即可。
即席过滤器如果要过滤 X,请将 X 作为字段放入索引中。在查询时,应用过滤器。
推荐阅读
- regex - Google data Studio REGEX_MATCH - 如何从字符串之间提取字符串?
- sql - 根据 Teradata 中的第二列获取不同的值
- google-cloud-platform - 来自数据流作业/计算引擎的 GCP CloudSql 连接限制
- python - 为什么 squareform 函数无法识别 Gower 矩阵?
- django - Django Admin 上传后立即显示图片
- hadoop - 使用纱线客户端获取所有执行应用程序容器的节点
- react-native - 使用 REST 中的经度和纬度获取方向
- javascript - 如何使用 javascript 获取 .wav 文件的“音频通道”、“采样率”、“每个样本的位数”?
- javascript - 从元素中获取属性
- python - 如何从 pandas 列执行搜索和匹配以创建新列?