0

假设我有一份财务管理员的工作(j:Job {name: 'financial administrator'})。

许多人对“财务管理员”使用不同的头衔。因此,即使人们只输入“财务”或“管理员”并且他们的输入有拼写错误(如:“财务”),我也希望上述工作成为热门。

CONTAINS 仅在匹配为 100% 时给出结果 - 因此没有拼写错误。

非常感谢!

4

2 回答 2

0

首先,您可以尝试使用全文索引进行模糊匹配,看看是否能解决问题。一个例子是:设置索引- 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语音jar一起放到Neo4j的plugin目录下,重启服务器。然后,使用此分析器创建全文索引:

CALL db.index.fulltext.createNodeIndex('jobs', ['Job'], ['name'], {analyzer:'phonetic'})

查询索引看起来是一样的:

CALL db.index.fulltext.queryNodes('jobs', 'fynancial')

于 2021-03-06T14:10:01.220 回答
0

花了一段时间,这就是我解决问题的方法。

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)
于 2021-04-17T12:44:37.700 回答