如何实现模糊搜索

时间:2016-01-02 19:14:12

标签: neo4j cypher

我正在使用Neo4j 3 REST API,我有一个名为customer的节点,它具有名称等属性,我需要获取客户名称的搜索结果,例如我应该为我的输入“joan”获得名称“john”的结果。如何实现模糊搜索以获得我想要的结果。

提前致谢

3 个答案:

答案 0 :(得分:4)

首先,我想让你知道,如果你使用的是Neo4j 3.x,那么3.x目前处于测试阶段且尚未被认为是稳定的。

您有两种方法可以在Neo4j中实现模糊搜索。您可以使用legacy indexes来实现基于Lecene的索引。这应该提供Lucene可以做的任何事情,尽管你可能需要做更多的工作。您还可以实现自己的unmanaged extension,这将允许您更直接地使用Lucene。

也许更简单的替代方法是将弹性搜索与Neo4j一起使用,并使elasticsearch执行全文索引。您可以查看neo4j.com上的Neo4j and ElasticSearch页面。在那里,他们提供了一个GitHub repository的链接,这是Neo4j的一个插件,可以使用来自Neo4j的数据自动更新ElasticSearch,并提供和端点来模糊查询图形。关于如何执行此操作还有一个video tutorial

答案 1 :(得分:1)

您将不得不尝试使用https://neo4j.com/developer/kb/how-to-perform-a-soundex-search/,在这种情况下它将起作用。如果您输入的是Joan,则不会得到John的响应,除非您仅输入jo作为输入,否则您会得到两个。要获得您期望的结果,您将必须使用soundex搜索。

答案 2 :(得分:0)

稍微退一步,你试图用模糊匹配解决的问题是什么?

我的经验是拼写错误和拼写错误远没有你想象的那么普遍,人类更喜欢精确匹配。如果没有完全匹配(通常只是在单词之间缺少空格),那么现在是使用拼写检查程序的好时机,而这就是模糊匹配应该启动的地方。

此外,您的示例将“joan”与“john”匹配,但是像“joanie”这样的同义词会更有用。如果您有大量的内容可供使用,您可以使用模糊和&amp ;;提取一些关系。机器学习识别“joanne”和“joni”作为可能的同义词,然后将其提交给人类策展人。 “Jon”看起来像一个相关的名字,但它不是,而“jo”甚至“nonie”在这些分组中可能是也可能不是昵称。