【问题标题】:full text search in databases数据库中的全文检索
【发布时间】:2016-09-26 20:02:46
【问题描述】:
关于数据库中的全文搜索,我有两个相当普遍的问题。我正在研究弹性搜索和 solr,在我看来,需要生成由表条目组成的单独文档,然后对其进行搜索。那么这样的搜索结果实际上不是数据库条目吗?还是我误会了什么?
我还研究了 whoosh 搜索,它会索引表列,而 whoosh 的结果是实际的表行。
使用 solr 或弹性搜索时,我是否应该将行 ID 放入要搜索的文档中,然后在获得结果后使用该 ID 从表中检索相关行?还是有更好的解决方案?
我的另一个问题是,如果我有一个像 abc/123.64664 这样存储为字符串的 id,那么使用 FTS 搜索这样的列有什么好处吗?在我看来,索引没有太多好处?还是我错了?
谢谢
【问题讨论】:
标签:
search
elasticsearch
solr
full-text-search
【解决方案1】:
(TL;DR) 不要考虑数据在 RDBS 中的结构。想想你在搜索什么。
良好全文搜索的内容存储与关系数据库标准存储完全不同。因此,您进入搜索引擎的数据最终可能看起来与您存储它的方式完全不同。
这一切都取决于您预期的搜索结果。您可以增加数据的粒度或 - 相反 - 对其进行非规范化,以便父/相关记录内容显示在您实际希望作为搜索的一部分返回的记录中。文本处理(copyField、标记化、预处理等)也是为了使记录可查找而进行的大量内容修改的地方。
有时,关系数据库支持全文搜索。 PostgreSQL 在这方面越来越好。但大多数时候,关系数据库并不能提供足够的灵活性来支持良好的相关性驱动搜索。
最后,如果原始架构相当复杂,那么仅使用搜索引擎来获取正确的相关 ID,然后将它们与原始数据库记录中的详细信息合并到客户端代码中可能是有意义的。
【解决方案2】:
Elasticsearch 可以存储索引文档,您可以将其作为查询结果的一部分进行检索。通常 ppl 仍然将原始数据存储在一个普通的数据库中,它为您在重新索引时提供了更多的可靠性和灵活性。请注意 ES 索引非关系数据。您可以以关系方式存储数据并编写非规范化文档以进行索引。
至于“abc/123.64664”,您可以将其索引为标记化字符串,也可以调整索引以进行前缀搜索等。这取决于您