当前位置: 首页 > 知识库问答 >
问题:

solr/lucene按文本匹配百分比评分?

洪高阳
2023-03-14

我有一个简单的需求,不确定配置solr是否容易做到这一点。

假设所有文档只有一个文本字段,没有标记化。

当查询进来时,我希望结果按匹配文本的百分比排序(包含)。百分比由len(查询)/len(匹配文本字段)计算

例如,有三个文档,文本字段如下:
doc1:abcdefghij
doc2:abcdefgh
3:abc

如果搜索词为“cde”,则文档1和文档2匹配(文本字段包含搜索词)。对于文件1,匹配百分比=3/10=30%
对于文件2,匹配百分比=3/8=37.5%

所以结果应该是:
doc2
doc1

这有意义吗?如何使用solr实现它?

谢谢

共有1个答案

漆雕安晏
2023-03-14

你可以超越Lucene得分。

扩展组织。阿帕奇。卢森。搜索DefaultSimilarity,定义自定义评分算法。

许多默认相似度的方法,你可能只想存根,比如idf(只需返回1),这样更复杂的评分元素就不会影响你的结果。

然后在solr的schema.xml中添加一行,配置它以使用您的评分类,例如:

<similarity class="com.mycompany.MySimilarity" /> 

这是一个页面,上面有一些关于评分工作的信息,请检查这里:Lucene评分。还有一些关于添加自定义功能的资源,这可能有助于组合一个可用的相似类。

不过,老实说,尤其是如果你是Lucene/Solr的新手,你最好能获得一些默认评分的经验。它工作得很好,你可以通过扔掉它来删除很多有价值的功能。

编辑:

注意,这提供了一种实现相似性的可能(尽管不太好)方法。再往下看另一条路。您仍然需要自定义相似性,但它更简单。

好吧,我来试试。我还没有对它进行测试(目前还不能进行测试),但它可能会为您指明正确的方向。

可能最简单的方法就是为每个字段存储一个编码术语长度的范数。要执行此操作,请重写computeNorm,并返回从第二个参数获取的长度的倒数。

为了计算指定的精确分数,需要访问匹配的查询项,或者它的长度。两者都不容易。您可能会找到一种方法,或者手动将该值传递到相似性类中。因为您只需要按照指定的顺序获取值,所以陈述需求的另一种方式是“从最短到最长的顺序结果”。我们已经用computeNorm完成了。

然后你只需剔除其余部分,就可以得到如下结果:

float computeNorm(String field, FieldInvertState state) {
    int length = state.getOffset() - state.getPosition();
    return 1.0 / (float)length;
}
float coord(int overlap, int maxOverlap) {
    return 1;
}
float idf(int docFreq, int numDocs) {
    return 1;
}
float tf(float freq) {
    return 1;
}
float queryNorm(float sumOfSquaredWeights) {
    return 1;
}
float sloppyFreq(int distance) {
    return 1;
}
float lengthNorm(string fieldName, int numTerms) {
    return 1;
}

注意:范数是在文档被索引时计算的,所以插入文档时必须使用这个相似性才能有效。查询时间来不及设置范数。它也是非常近似的,由于压缩。

更简单的方法(也许):

你知道,现在我想起来了,因为同样的排序是通过从最短到最长的排序来获得的,所以你可以在没有新的相似性类的复杂性的情况下进行排序。当你添加文档时,你可以应用一个字段级别的提升来完成同样的事情。只需将这些项的长度增加1/length,或者采用类似的方法。

如果您插入abcde,则在字段上增加1/5。

这样做之后,你甚至可以像“term:abc*^3”这样进行查询,这样你就可以得到你之前指出的百分比分数(尽管两种方式的效果基本相同,只有一个查询项)。

我认为如果你使用这样的提升得分,你应该能够在你的自定义相似性中剔除所有东西。“idf”和“tf”可能是你在这种情况下真正需要担心重写的全部。

 类似资料:
  • 问题内容: 我正在使用SQL Server 2008 R2 SP1。 我有一张约有36034个客户记录的表。我正在尝试在“客户名称”字段上实施Fuzy搜索。 这是模糊搜索的功能 这是调用该函数的查询 这大约需要2分22秒,可以为我提供所有对象的模糊匹配百分比 我如何解决此问题以在不到一秒钟的时间内运行。关于我的功能的任何建议,以使其更强大。 预期输出为45.34、40.00、100.00、23.0

  • Apache Lucene and Solr have separate repositories now! Solr has become a top-level Apache project and main linedevelopment for Lucene and Solr is happening in eachproject's git repository now: Lucene:

  • 问题内容: 假设我要按第10到20个百分点内的某个字段过滤文档。我想知道是否可以通过一些简单的查询(例如)进行查询。 说我有这些文件: 我需要按(升序) 从前10位到第10位进行过滤,然后按降序对结果进行排序,然后进行分页(如第2页,第10页)每页的项目)。 想到的一种解决方案是: 获取文件总数。 将文档按排序,取对应的限制 写最终查询,像 但是缺点也很明显: 如果我们谈论的是亚秒级延迟,则似乎效

  • null 以下是文档 我在想--如果我不想偏向更短的文档,那么field.setomitnormals(true)足够吗?

  • 我刚开始使用Lucene,并试图了解如何使用Lucene实现更简单的评分函数。 对于查询,我想要一个排序,其中的排序高于和。

  • 我正在使用以下查询对象执行多匹配搜索: 我希望结果按高亮匹配的数量排序。例如,第一张唱片有5张。 elasticsearch.config.ts 示例数据