Neo4j全文索引:找到的字词

u0njafvf  于 2022-11-05  发布在  其他
关注(0)|答案(2)|浏览(161)

我使用了Neo4j的db.index.fulltext.queryNodes,并使用通配符得到了很好的结果。
有没有办法返回在搜索文本中找到的特定术语?例如,我搜索Sm*th,希望看到Smith或Smyth。
在Neo4j中,我在节点属性“ancoustrivous_surnames”上创建了索引,这是一个非结构化的姓氏字符串。

CREATE FULLTEXT INDEX ancestor_surnames_names FOR (n:ancestor_surnames)\n" +
"ON EACH [n.name]

然后,我搜索一个姓氏和关联的DNA_Match节点:

CALL db.index.fulltext.queryNodes('ancestor_surnames_names', 'Stinn*tt ') YIELD node, score 
WITH score,node.p as match,node.name as anc_names 
MATCH (m:DNA_Match{fullname:match}) 
return distinct m.fullname,match,anc_names order by m.fullname

我得到了完整的非结构化的姓氏列表,并希望提取出找到的术语。

vpfxa7rd

vpfxa7rd1#

下面的例子用于搜索Movies数据库。你可以对你的节点Person做类似的操作。
对于Neo4j版本4.2及更低版本,请使用以下语法:

CALL db.index.fulltext.createNodeIndex("titlesIndex", ["Movie"], ["title"])


Neo4j 4.3以上版本

CREATE FULLTEXT INDEX titlesIndex FOR (n:Movie) ON EACH [n.title]

然后使用 * 或?通配符进行如下查询。

CALL db.index.fulltext.queryNodes("titlesIndex", "?re*") YIELD node, score
WITH node.title as title, score
MATCH (n:Movie {title:title}) 
WITH [w in split(n.title," ") where w =~ '(?i).*re.*' | w] as words, n, score
RETURN words[0] as match, n.title, score   

//where (?i) means ignore upper or lower case letters
//        .* means match any letter before and after "re"

╒════════╤══════════════════════╤═══════╕
│"match" │"n.title"             │"score"│
╞════════╪══════════════════════╪═══════╡
│"Dreams"│"What Dreams May Come"│1.0    │
├────────┼──────────────────────┼───────┤
│"Green" │"The Green Mile"      │1.0    │
└────────┴──────────────────────┴───────┘
brccelvz

brccelvz2#

谢谢何塞...
这是一个完整的查询,它给出了我想要的结果,包括找到的两个单词的列表。查询本身需要在我正在创建的用户定义函数中用java代码动态创建。但是这很巧妙!

CALL db.index.fulltext.queryNodes('ancestor_surnames_names', 'Stennett AND Kent') YIELD node, score WITH score,node.p as match,node.name as anc_names,node 
MATCH (m:DNA_Match{fullname:match}) 
WITH m,score,anc_names,[w in split(node.name," ") where w =~ 'Stennett' or w=~ 'Kent' | w] as words
return distinct m.fullname as DNA_Match_name,case when m.RN is null then '-' else toString(m.RN) end as RN,round(score,2) as score,words, anc_names as ancestor_list order by score desc,m.fullname

相关问题