3

我有一个关于书籍的数据集,每本书都可以是一种或多种语言。每个用户都注册为具有一种或多种语言。

当用户搜索书籍时,我只想返回他们理解所有语言的书籍。

例如,系统中有以下两本书:

Book A: English, French, German
Book B: English, Greek

如果 John 被注册为会英语、德语、法语和意大利语,那么他的查询结果不应该包括 Book B。

我的系统目前是使用Apache Solr编写的,我最终编写了一个插件来执行子集操作(如果记录的语言是用户语言的子集,则记录匹配,其中用户的语言在询问)。

但是,我想过渡到Elasticsearch后端。然而,这种特殊的子集行为似乎不是核心过滤器包的一部分。我错过了什么,还是我应该看看写一个类似的插件/自定义过滤器?

4

2 回答 2

1

这可以使用脚本过滤器来完成,您可以将逗号分隔的字符串列表作为参数传递给它,并使用 for 循环来确保包含每个组件,如果甚至没有使用 break 并返回 false。如果所有存在的循环都退出并返回true。

我不确定这有多有效,但理论上这可以在 elasticsearch 上完成。理想情况下,应用优化的过滤器来缩小书籍集,然后在这些子集上运行它查看https://www.elastic.co/blog/all-about-elasticsearch-filter-bitsets和 post_filters 上的文档,效率应该最好在一堆查询上进行测试,因为一旦开始缓存它的结果,这个过滤器就会更好地执行

于 2015-04-27T18:44:19.810 回答
0

另一个可能的答案是将问题倒转过来。这些数据具有某些特征。假设有足够的规模和现实世界的实用性,基本的想法是语言领域的基数极低的书籍、用户和作者(你可以通过使用语言根作为一个领域来进一步改进这一点,例如拉丁语——英语、意大利语和原始语言http://en.wikipedia.org/wiki/List_of_proto-languages在索引时)通常用户倾向于了解同一家族的语言,因此您可以利用这一事实为您带来好处。

那么用户查询本质上是所有存在的集合和他知道的集合的差异。这些可以很容易地建模为一组过滤器,使用 execution:bool 标志(内部极度优化的位集)来缓存和组合它们。确保您对过滤器的执行顺序很了解,请查看https://www.elastic.co/blog/all-about-elasticsearch-filter-bitsets

于 2015-04-27T19:00:30.210 回答