ruby-on-rails 在思考sphinx时,如何在搜索多个索引时优先给予特定索引

wwwo4jvm  于 2023-01-14  发布在  Ruby
关注(0)|答案(1)|浏览(100)

我正在使用Thinking Sphinx和rails 5.2.2。在最终输出中,我需要优先选择一个索引的数据,同时搜索多个索引。例如,我有一个属性为attr = foo的索引index1和另一个属性为attr = foo的索引index2。我想要的是,如果attrfoo(或其他值)匹配,则ThinkingSphinx.search应始终返回index2中的数据。如果index2中没有attrfoo匹配的记录,则应返回index1中的记录。注意:我需要对attr上的结果进行分组
下面是我正在使用的一个查询示例。

ThinkingSphinx.search("@attr =foo|foo*", group_by: :attr, middleware: ThinkingSphinx::Middlewares::RAW_ONLY, indices: ['index1', 'index2'])

根据this documentation(搜索多个索引),应返回后面索引(本例中为index2)中的数据。但有些记录从index1返回,有些从index2返回。

wnavrhmk

wnavrhmk1#

Sphinx没有一个直接的概念来区分一个索引与另一个索引的优先级,但是您可以向每个模型添加一个属性来指示重要性,然后按此排序。
在索引定义中:

# SQL-backed indices:
has "1", as: :priority

# Or, real-time indices:
has priority
# And add a method to each model returning an appropriate integer

然后搜索:

ThinkingSphinx.search(
  "@attr =foo|foo*",
  group_by: :attr,
  middleware: ThinkingSphinx::Middlewares::RAW_ONLY,
  indices: ['index1', 'index2'],
  select: '*, weight() as w',
  order: 'priority ASC, w DESC'
)

相关问题