我有一个关于书籍的数据集,每个都可以使用一种或多种语言。每个用户都注册为拥有一种或多种语言。
当用户搜索图书时,我只想回复那些了解所有语言的图书。
例如,系统中有以下两本书:
Book A: English, French, German
Book B: English, Greek
如果John注册为英语,德语,法语和意大利语,那么他的查询结果绝不应包括B语。
我的系统目前使用Apache Solr编写,我最终编写了一个插件来执行子集操作(如果记录的语言是用户语言的子集,则记录匹配,其中用户的语言在查询中声明。
但是,我想转换到Elasticsearch后端。但是,这种特定的子集行为似乎不是核心过滤器包的一部分。我错过了什么,或者我应该考虑编写类似的插件/自定义过滤器?
答案 0 :(得分:1)
这可以使用脚本过滤器完成,您可以将逗号分隔的字符串列表作为参数传递给它,并使用for循环来确保每个组件都包含在内,即使一个不使用break并返回false。如果所有存在的循环退出并返回true。
我不确定这是多么有效,但从理论上讲,这可以在elasticsearch上完成。理想情况下应用优化过滤器来缩小书籍集,然后在https://www.elastic.co/blog/all-about-elasticsearch-filter-bitsets和post_filters上的文档上运行这些子集,效率应该通过一堆查询进行理想的测试,因为这个过滤器会在结果开始被缓存
答案 1 :(得分:0)
另一个可能的答案是将问题转化为头部。这些数据具有某些特征。假设有足够的规模和现实世界的实用性,基本的想法是语言领域的基数是非常低的书籍,用户和作者(你可以通过使用语言根源作为字段,例如拉丁语 - 英语,意大利语和原语言来进一步改善这一点在索引时http://en.wikipedia.org/wiki/List_of_proto-languages)用户经常会知道来自同一家庭的语言,因此您可以利用这一事实为您带来好处。
然后,用户查询将基本上是所有存在的集合和他所知道的集合的差异。这些可以很容易地建模为一堆过滤器,使用执行:bool标志(内部极其优化的位集)来缓存和组合它们。确保您明智地了解过滤器的执行顺序,请查看https://www.elastic.co/blog/all-about-elasticsearch-filter-bitsets