【问题标题】:Can Cypher do phonetic text search with only a part of the text, without using elastic search?Cypher 是否可以仅使用部分文本进行语音文本搜索,而不使用弹性搜索?
【发布时间】:2021-06-02 01:39:19
【问题描述】:

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

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

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

非常感谢!

【问题讨论】:

  • 我们还没有到达那里,但我们会到达那里。

标签: neo4j cypher text-search elasticsearch-phonetic


【解决方案1】:

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

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

查询索引看起来一样:

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

【讨论】:

    【解决方案2】:

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

    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)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-06-03
      • 2013-03-31
      • 2017-03-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多