Lucene 自定义数字字段评分
除了在文本内容字段上使用 tf-idf 相似性进行标准术语搜索之外,我还希望根据数字字段的“相似性”进行评分。这种相似性将取决于查询中的值和文档中的值之间的距离(例如,高斯,m = [用户输入],s = 0.5)
,即假设文档代表人,而人文档有两个字段:
- 描述(全文)
- 年龄(数字)。
我想找到像
描述这样的文档:(xyz)年龄:30
,但年龄不是过滤器,而是分数的一部分(对于30岁的人,乘数将为1.0,对于25岁的人)老人 0.8 等)
这可以通过合理的方式实现吗?
编辑:最后我发现这可以通过使用 CustomScoreQuery 包装 ValueSourceQuery 和 TermQuery 来完成。请参阅下面我的解决方案。
编辑 2: 随着 Lucene 版本的快速变化,我只想补充一点,它是在 Lucene 3.0 (Java) 上进行测试的。
I would like to have, in addition to standard term search with tf-idf similarity over text content field, scoring based on "similarity" of numeric fields. This similarity will be depending on distance between the value in query and in document (e.g. gaussian with m= [user input], s= 0.5)
I.e. let's say documents represent people, and person document have two fields:
- description (full text)
- age (numeric).
I want to find documents like
description:(x y z) age:30
but age to be not the filter, but rather part of score (for person of age 30 multiplier will be 1.0, for 25-year-old person 0.8 etc.)
Can this be achieved in a sensible manner?
EDIT: Finally I found out this can be done by wrapping ValueSourceQuery and TermQuery with CustomScoreQuery. See my solution below.
EDIT 2: With fast-changing versions of Lucene, I just want to add that it was tested on Lucene 3.0 (Java).
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(2)
好的,这是(有点冗长)作为完整 JUnit 测试的概念验证。尚未测试其针对大型索引的效率,但从我所读到的内容来看,在预热后它应该表现良好,前提是有足够的 RAM 可用于缓存数字字段。
Okay, so here's (a bit verbose) proof-of-concept as a full JUnit test. Haven't tested its efficiency yet for large index, but from what I've read probably after a warm-up it should perform well, providing there's enough RAM available to cache numeric fields.
这可以使用 Solr 的 FunctionQuery 来实现
This can be achieved using Solr's FunctionQuery