在 Neo4j 全文搜索中处理空格

Handle whitespace in Neo4j full text search

我需要一些关于全文搜索的帮助。

我创建了一个这样的索引:

CALL db.index.fulltext.createNodeIndex("ReasourceName",["Resource"],["name"])

我可以查询并得到结果:

CALL db.index.fulltext.queryNodes('ReasourceName', 'bmc pumping station~') YIELD node, score 
WITH node, score 
RETURN node.name, score
limit 10;

输出:

╒════════════════════════════════╤══════════════════╕
│"node.name"                     │"score"           │
╞════════════════════════════════╪══════════════════╡
│"BMC Pumping Station"           │8.143752098083496 │
├────────────────────────────────┼──────────────────┤
│"BMC Office"                    │2.944127082824707 │
├────────────────────────────────┼──────────────────┤
│"BMC Office"                    │2.944127082824707 │
├────────────────────────────────┼──────────────────┤
│"BMC Dispensary"                │2.944127082824707 │
├────────────────────────────────┼──────────────────┤
│"BMC Office"                    │2.944127082824707 │
├────────────────────────────────┼──────────────────┤
│"BMC Dispensary"                │2.944127082824707 │
├────────────────────────────────┼──────────────────┤
│"BMC Office"                    │2.944127082824707 │
├────────────────────────────────┼──────────────────┤
│"Police Station"                │2.6569595336914062│
├────────────────────────────────┼──────────────────┤
│"Momo Station"                  │2.6569595336914062│
├────────────────────────────────┼──────────────────┤
│"BMC Shikshak Bhavan"           │2.515393018722534 │
└────────────────────────────────┴──────────────────┘

但是,如果输入查询的空格不同,它的性能会很差。例如,我希望查询 bmcpumpingstationbmcpumpingstation~ 具有相似的结果集,但是它 returns 什么都没有。

似乎没有适用于编辑距离的分析器。

(我也在 neo4j community 上问过这个问题,但没有得到回复)

看来您需要清理数据!

match (m:Resource) set m.name=replace(m.node,"~","")

或者在加载数据之前进行清理。

底层引擎是 Lucene,其流程是对文本进行标记并将其存储为标记。

然后当您“搜索”时,它会标记您的搜索字符串并比较您的搜索和索引中的标记。

我建议阅读这篇文章(注意 Neo4j 做了一些更改,但 90% 今天仍然有效):https://graphaware.com/neo4j/2019/01/11/neo4j-full-text-search-deep-dive.html

因此,如果您搜索 bmcpumpingstation 并且您的索引包含以下标记:

bmcpumpingstation

那根本就没有匹配。

如果你想稍微破解一下并让这种类型的搜索工作,你可以为此创建一个专用索引,并在索引时删除名称中的所有空格,然后你可以使用 bmcpumpingstation搜索有些模糊