2

我正在使用 SolrNet 访问 Solr 索引,其中有一个名为“tags”的多值字段。我想执行以下伪代码查询:

(tags:stack)^10 OR (tags:over)^5 OR (tags:flow)^2

其中术语“stack”被提升了 10,“over”被提升了 5,“flow”被提升了 2。我想要的结果是“stack”的结果会比“stack”的结果更高流”等。

我遇到的问题是说“流”只出现在几个文档中,但“堆栈”出现在负载中,然后由于高 idf 值,带有“流”的文档出现在带有“堆栈”的文档之上。

当这个项目直接在 Lucene 中实现时,我使用了 ConstantScoreQuery,这些消除了仅基于 boost 值的分数的 idf。

如何使用 Solr 和 SolrNet 来实现这一点,我实际上只是向 Solr 传递了一个查询字符串?如果不能,有没有其他方法可以解决这个问题?

提前致谢!

4

2 回答 2

9

Solr 5.1 及更高版本通过 ^= 运算符将此内置到查询解析器语法中。

因此,只需使用您的原始查询: (tags:stack)^10 OR (tags:over)^5 OR (tags:flow)^2

并将 ^ 替换为 ^= 以从提升变为常量: (tags:stack)^=10 OR (tags:over)^=5 OR (tags:flow)^=2

于 2014-06-20T16:30:48.650 回答
3

我认为没有任何方法可以在 Solr 中直接表达 ConstantScoreQuery,但似乎范围和前缀查询在后台使用 ConstantScoreQuery,因此您可以尝试伪造范围查询,例如tags:[flow TO flow]

或者,您可以实现自己的 Solr QueryParser。

于 2010-12-15T20:23:07.597 回答