【问题标题】:Elasticsearch subset filterElasticsearch 子集过滤器
【发布时间】:2015-04-28 03:14:47
【问题描述】:

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

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

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

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

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

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

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

【问题讨论】:

  • 您是否发现 ElasticSearch(或任何其他数据库/搜索系统)是否有办法涵盖此问题?
  • 不——我最终得到了一个替代实现,我在其中查询 (elasticsearch) 书籍,然后对它们进行一些快速的 java 操作,以确定用户是否可以理解所有语言。如果某些语言无法理解,则会标记结果集,并将其传达给用户。不过,我很想知道有一种方法可以实现原始设计!
  • 到目前为止,这是我自己的笔记:docs.google.com/document/d/…。如果您或其他任何人为此找到现成的解决方案(可能可以处理大型系列),请告诉我。如果我找到什么,我一定会亲自回到这里:)

标签: elasticsearch elasticsearch-plugin


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-05
      • 1970-01-01
      • 2017-07-27
      • 2015-09-17
      • 2014-02-02
      相关资源
      最近更新 更多