Roe*_*rel 8 full-text-search full-text-indexing neo4j
我看到 Neo4j 有支持全文搜索的索引。但是我在文档中找不到关于如何将这种能力用于常规关系查询的示例。
例如,我有以下结构: (:User)->[:Wrote]->(:Review)->[:Reviewing]->(:Movie)
我想使用全文搜索功能搜索评论,但仅针对特定用户。所以用户“123”想搜索他所有的评论,其中包含“伟大的表演”。所以搜索用户的评论将是MATCH (:User { id: 123 })-[w]->(review)。在搜索带有“伟大”和“表演”字样的评论时CALL db.index.fulltext.queryNodes("reviews", "great acting")
我想不通的是如何将两者与 AND 逻辑结合起来。
编辑
我想我可以做以下事情:
CALL db.index.fulltext.queryNodes("reviews", "great acting") YIELD node as reviews
MATCH (:User { id: 123 })-[w]->(reviews)
Run Code Online (Sandbox Code Playgroud)
问题是,我可能有数百万条评论“很棒”或“表演”,而相关用户可能没有超过 10 条评论。听起来效率不高。
在这种特殊情况下,全文搜索在性能方面不会有帮助,因为这会选择所有包含“出色表演”的评论(其中可能有很多很多),然后您需要过滤掉那些属于给有问题的用户。
这比匹配有问题的用户的评论(其中应该相对少得多)然后过滤那些“伟大的表演”这个词的性能要低得多。
您可以在 WHERE 子句中使用 CONTAINS 关键字来确保属性包含给定的子字符串,如 Raj 的回答(尽管这是区分大小写的):
MATCH (:User{ id: 123 })->[:Wrote]->(review:Review)->[:Reviewing]->(:Movie)
WHERE review.text CONTAINS 'great acting'
...
Run Code Online (Sandbox Code Playgroud)
您也可以在此基础上创建索引,但如果不用于在此处查找而是从用户节点开始,效率会更高(您可以解释查询以确定使用哪些索引来查找起始节点) ))。
如果您需要不区分大小写的关键字搜索,您可以为此使用=~ 正则表达式运算符,尽管这不是索引支持的。例如:
MATCH (:User{ id: 123 })->[:Wrote]->(review:Review)->[:Reviewing]->(:Movie)
WHERE review.text =~ '(?i).*great acting.*'
...
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
969 次 |
| 最近记录: |