在 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 │
└────────────────────────────────┴──────────────────┘
但是,如果输入查询的空格不同,它的性能会很差。例如,我希望查询 bmcpumpingstation
或 bmcpumpingstation~
具有相似的结果集,但是它 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
并且您的索引包含以下标记:
bmc
、pumping
、station
那根本就没有匹配。
如果你想稍微破解一下并让这种类型的搜索工作,你可以为此创建一个专用索引,并在索引时删除名称中的所有空格,然后你可以使用 bmcpumpingstation
搜索有些模糊
我需要一些关于全文搜索的帮助。
我创建了一个这样的索引:
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 │
└────────────────────────────────┴──────────────────┘
但是,如果输入查询的空格不同,它的性能会很差。例如,我希望查询 bmcpumpingstation
或 bmcpumpingstation~
具有相似的结果集,但是它 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
并且您的索引包含以下标记:
bmc
、pumping
、station
那根本就没有匹配。
如果你想稍微破解一下并让这种类型的搜索工作,你可以为此创建一个专用索引,并在索引时删除名称中的所有空格,然后你可以使用 bmcpumpingstation
搜索有些模糊