2014-06-15 130 views
1

我有一本关于书籍的数据集,每个书籍都可以使用一种或多种语言。每个用户都注册为拥有一种或多种语言。Elasticsearch子集筛选器

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

例如,下面的两本书是系统:

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

如果约翰被注册为不懂英语,德语,法语和意大利语,那么他的查询结果中不应包括书B.

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

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

+1

您是否发现ElasticSearch(或任何其他数据库/搜索系统)覆盖此方法? – Tor

+0

不 - 我最终得到了一个替代实现,在这里我查询(elasticsearch)书籍,然后在它们上面快速查找一下java,以确定用户是否可以理解所有语言。如果某些语言不被理解,结果集将被标记,并将其传递给用户。不过,我很乐意听到有一种实现原始设计的方法! –

+1

以下是我自己的笔记:https://docs.google.com/document/d/1ngZU89rWc3fQMU8CSSW_yFCyeWEmJzJRngmEl88IrvE。如果你或其他人发现了一个现成的解决方案(这可能可以处理大集),那么让我知道。如果我找到一些东西,我一定会回到这里来:) – Tor

回答

1

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

我不确定这是多高效,但理论上这可以在elasticsearch上完成。理想情况下,应用优化的过滤器来缩小书籍的范围,然后在这些子集上查看https://www.elastic.co/blog/all-about-elasticsearch-filter-bitsets以及post_filters上的文档,效率应该在一系列查询中进行理想测试,因为一旦结果开始为缓存

0

另一个可能的答案是将其颠倒过来。这些数据具有一定的特征。假设足够的规模和现实世界的实用性,其基本思想是对于书籍,用户和作者而言,语言领域的基数是极低的(你可以通过使用语言根作为一个领域来进一步改进,例如拉丁语 - 英语,意大利语和原语言http://en.wikipedia.org/wiki/List_of_proto-languages)索引时间)用户通常倾向于从同一个家庭中了解语言,这样您就可以利用这一事实来获益。

然后,用户查询将基本上是所有存在的集合和他知道的集合的差异。这些可以很容易地建模为一堆使用执行的过滤器:bool标志(内部非常优化的位集)来缓存和合并它们。确保你明智的执行过滤顺序看看https://www.elastic.co/blog/all-about-elasticsearch-filter-bitsets