【问题标题】:Lucene full-text index: all indexed nodes with same score?Lucene全文索引:所有索引节点具有相同的分数?
【发布时间】:2015-08-20 15:57:52
【问题描述】:

我这几天一直在尝试解决这个问题。

我想对全文进行START 查询,按相关性排序,以便对结果进行分页。

很高兴,我终于在全文索引和 Neo 上找到了这个帖子(并使用 python 作为驱动程序)。

[https://groups.google.com/forum/#!topic/neo4j/9G8fcjVuuLw]

我已经用批量超级导入器导入了我的数据库,并得到了@Michaelhunger 的回复,他注意到有一个错误,所有分数都会被导入相同的值。

所以,现在我正在重新创建索引,并通过 REST 检查分数 (&order=score)

http://localhost:7474/db/data/index/node/myInde?query=name:myKeyWord&order=score

并注意到条目的分数仍然相同

您必须执行 ajax 查询才能看到它,因为如果您使用 Web 控制台,您将看不到所有数据!!

我的代码重新创建全文 lucene 索引,每个节点属性“名称”: (这里使用 neo4j-rest-client,但我也会尝试使用 py2neo,就像在 Google 讨论中一样):

from neo4jrestclient.client import GraphDatabase
gdb = GraphDatabase("http://localhost:7474/db/data/")

myIndex =  gdb.nodes.indexes.create("myIndex", type="fulltext", provider="lucene")

myIndex.add("name",node.get("name"),node)

结果:

http://localhost:7474/db/data/index/node/myInde?query=name:DNA&order=score

data Object {id: 17062920, name: "DNA damage theory of aging"}
VM995:10 **score 11.097855567932129**
...
data Object {id: 17022698, name: "DNA (film)"}
VM995:10 **score 11.097855567932129**

在文档中: [http://neo4j.com/docs/stable/indexing-lucene-extras.html#indexing-lucene-sort] 据说 Lucene 本身的排序非常好,所以我理解它在导入时自己创建了一个排名;它没有。

我做错了什么或错过了什么?

【问题讨论】:

    标签: neo4j lucene full-text-search py2neo neo4jrestclient


    【解决方案1】:

    我相信您看到的问题与您正在索引的文本、查询词以及 Michael Hunger 指出的 Neo4j 中当前具有 OMITNORMS=true 的 lucene 配置的组合有关。使用此设置,lucene 查询,如您发布的示例中一样,其中有不同大小的文本,但查询词在每个文档中出现一次通常会导致相同的 lucene 相关性分数。原因是当 OMITNORMS 为真时,不考虑被索引文档的大小/长度(字段长度规范化)。

    查看您的示例并不清楚您的预期结果是什么。例如,您是否希望文本较短的文档首先出现?

    根据我自己使用 lucene 和 Neo4j 的经验,我见过许多实例,其中返回的相关性分数在不同的查询中是不同的。

    【讨论】:

    • 嗨@mfkilgore,在哪里可以设置OMITNORMS=false?我期望的结果在这里描述:[stackoverflow.com/q/31862761/305883] - 我需要对结果进行分页,并且前 n 项必须满足用户查询中的关键字 - 对于最简单的情况可能是最短的字符串;它可以通过 levenshtein 或其他索引词干的排名来获得。例如,在 python 中使用nltk(我看到你使用 py2neo),甚至可以提取词干并将它们添加到旧索引中——但正确设置分数的最后一步很重要。
    • 当前版本无法设置 OMITNORMS。查看您的示例,尚不清楚问题出在哪里,显示的文本确实包含在查询中正确找到的短语 United States。在 lucene 中评分是一个有趣的话题,您可以在此处找到更多信息 - lucene.apache.org/core/3_6_2/scoring.html。请注意,多个文档可能具有相同的分数。
    • 如果只是在字符串中被关键字满足,没有顺序,结果是没有意义的。在我提供的示例中,“美国”将被隐藏在数千行中,并且第一个结果,例如“美国联邦和领土、关联州和外国的美国国家历史地标列表”是“随机的”。实际上,经过对线程的大量研究,我发现它是按neo4j的ID排序的。如果不可能,我认为 neo4j 文档在这方面具有误导性,因为它提出了应用于 lucene 遗留索引的相关示例;不可能。
    • 很抱歉您遇到了问题。在我的许多查询中,我确实看到了不同的分数,并且结果按相关顺序返回。根据查询的不同,我还看到排名靠前的文档得分相同的结果,这可能是您所看到的,这可能会发生,并且当它发生时,没有保证顺序。
    • 我看到 所有查询 的分数相同(在 4M 实体的数据库上,与查询匹配的行数无关)。如果有相关顺序,那么它的设置方式必须有一个标准,我发布的示例表明唯一的标准是 neo4j 的 ID。我很乐意和你一起“解决”。你可以聊天吗?这可能会很有帮助。
    【解决方案2】:

    我的问题的目标是获得一个按与查询关键字匹配的节点名称的相关性排序的结果列表。

    @mfkilgore 指出了这个解决方法:

    start n=node:topic('name:(keyword1* AND keyword2*)') MATCH (n)  with n order by length(split(n.name," ")) asc limit 20 return n
    

    此解决方法计算节点名称中的字符数,然后按字符串长度排序。

    【讨论】:

      猜你喜欢
      • 2016-05-13
      • 2011-01-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-02-22
      • 2020-02-05
      相关资源
      最近更新 更多