Cypher 是否可以在不使用弹性搜索的情况下仅使用部分文本进行语音文本搜索?
Can Cypher do phonetic text search with only a part of the text, without using elastic search?
假设我有一份财务管理员的工作 (j:Job {name: 'financial administrator'})。
许多人对 'financial administrator' 使用不同的标题。因此,我希望上述工作成为热门,即使人们只输入 'financial' 或 'administrator' 和 他们的输入有拼写错误(如:'fynancial') .
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', ['Job'], ['name'], {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)
假设我有一份财务管理员的工作 (j:Job {name: 'financial administrator'})。
许多人对 'financial administrator' 使用不同的标题。因此,我希望上述工作成为热门,即使人们只输入 'financial' 或 'administrator' 和 他们的输入有拼写错误(如:'fynancial') .
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', ['Job'], ['name'], {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)