如何解决Cypher 是否可以仅使用部分文本进行语音文本搜索,而不使用弹性搜索?
假设我有一份财务管理员的工作(j:Job {name: 'financial administrator'})。
许多人对“财务管理员”使用不同的头衔。因此,我希望上述工作成为热门,即使人们只输入“财务”或“管理员”并且他们的输入有拼写错误(例如:“财务”)。
CONTAINS 仅在匹配率为 100% 时才给出结果 - 所以没有错别字。
非常感谢!
解决方法
首先,您可以尝试使用全文索引进行模糊匹配,看看是否能解决问题。
一个例子是:
设置索引——
CALL db.index.fulltext.createNodeIndex('jobs',['Job'],['name'],{})
使用模糊匹配查询索引(注意~
)
CALL db.index.fulltext.queryNodes('jobs','fynancial~')
如果您想进一步使用 Lucene 的语音搜索,那么您可以编写一些 Java 代码来注册自定义分析器。
像这样包含 lucene-analyzers-phonetic
依赖项:
<dependency>
<groupId>org.apache.lucene</groupId>
<artifactId>lucene-analyzers-phonetic</artifactId>
<version>8.5.1</version>
</dependency>
然后创建一个自定义分析器:
@ServiceProvider
public class PhoneticAnalyzer extends AnalyzerProvider {
public PhoneticAnalyzer() {
super("phonetic");
}
@Override
public Analyzer createAnalyzer() {
return new Analyzer() {
@Override
protected TokenStreamComponents createComponents(String s) {
Tokenizer tokenizer = new StandardTokenizer();
TokenStream stream = new DoubleMetaphoneFilter(tokenizer,6,true);
return new TokenStreamComponents(tokenizer,stream);
}
};
}
}
我使用了 DoubleMetaphoneFilter,但您可以尝试使用其他方法。 打包成jar包,和Lucene phonetic jar一起放到Neo4j的plugin目录下,重启服务器。 然后,使用此分析器创建全文索引:
CALL db.index.fulltext.createNodeIndex('jobs',{analyzer:'phonetic'})
查询索引看起来一样:
CALL db.index.fulltext.queryNodes('jobs','fynancial')
花了一段时间,这就是我解决问题的方式。
MATCH (a)-[:IS]->(hs)
UNWIND a.naam AS namelist
CALL apoc.text.phonetic(namelist) YIELD value
WITH value AS search_str,SPLIT('INPUT FROM DATABASE',' ') AS input,a
CALL apoc.text.phonetic(input) YIELD value
WITH value AS match_str,search_str,a
WHERE search_str CONTAINS match_str OR search_str = match_str
RETURN DISTINCT a.naam,label(a)
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。