天天看點

NEO4J中文分詞全文索引自動更新解決方案

neo4j-graph-plugin插件位址:https://github.com/crazyyanchao/neo4j-graph-plugin

NEO4J中文分詞全文索引自動更新解決方案

  • 一、樣例資料
  • 二、英文與中文全文索引差别
    • 1、建立NEO4J預設索引
    • 2、删除索引
    • 3、建立支援中文分詞的索引
  • 三、APOC自帶英文全文索引過程(可自動更新索引)
    • 1、添加全文索引
    • 2、新增節點與屬性
    • 3、檢索
  • 四、自定義中文分詞全文索引插件(自動更新索引不成功)
  • 五、标簽交叉檢索
  • 六、自定義中文分詞插件(自動更新索引失敗單獨更新節點索引)
    • 2、新增節點與屬性并更新全文索引
    • 3、将2新增的節點或者更新的屬性增加到索引
    • 4、檢索
  • 七、解決事務送出逾時
  • 八、備注
使用NEO4J INDEX API實作自動更新失敗,轉換了一種思路解決這個問題(在更新節點或者建立節點的時候同步更新到對應的全文索引中。)

樣例資料格式參考

NEO4J中文分詞全文索引自動更新解決方案

CALL apoc.index.addAllNodes('Loc', {Loc:["description","cause","year"]})
           
// 以下檢索不成功:
CALL apoc.index.search('Loc', 'Loc.description:中文~') YIELD node RETURN node
CALL apoc.index.search('Loc', 'Loc.description:中文*') YIELD node RETURN node
CALL apoc.index.search('Loc', 'Loc.description:測試~') YIELD node RETURN node
CALL apoc.index.search('Loc', 'Loc.description:測試中文~') YIELD node RETURN node
           

CALL apoc.index.remove('Loc')
           

CALL zdr.index.addChineseFulltextIndex('Loc', ["description","cause","year"], 'Loc') YIELD message RETURN message
           
// 以下檢索成功:
CALL apoc.index.search('Loc', 'description:中文~') YIELD node RETURN node
CALL apoc.index.search('Loc', 'description:中文*') YIELD node RETURN node
CALL apoc.index.search('Loc', 'description:測試~') YIELD node RETURN node
CALL apoc.index.search('Loc', 'description:測試中文~') YIELD node RETURN node
           

CALL apoc.index.addAllNodes('Loc', {Loc:["description","cause","year"]},{autoUpdate:true})
           

CREATE (n:Loc {name:'V'})  SET n.description='測試中文分詞,複聯終章快上映了好激動,據說知識圖譜與人工智能技術應用到了那部電影!',n.cause='測試英文分詞,Mobile World Congress, the world’s largest gathering for the mobile industry, ' RETURN n
           

可以支援索引的自動更新,但是對于中文的檢索不友好,例如以下測試:

// 檢索失敗:
CALL apoc.index.search('Loc', 'Loc.cause:測試英文分詞~') YIELD node RETURN node
CALL apoc.index.search('Loc', 'Loc.description:測試中文分詞~') YIELD node RETURN node
           
// 檢索成功:
CALL apoc.index.search('Loc', 'Loc.cause:測試英文分詞*') YIELD node RETURN node
CALL apoc.index.search('Loc', 'Loc.description:測試中文分詞*') YIELD node RETURN node
           

addChineseFulltextAutoIndex過程為添加支援中文的全文索引過程,建立全文索引可以成功,但是對于節點的新增屬性的更新,不支援自動更新。

CALL zdr.index.addChineseFulltextAutoIndex('IKAnalyzer',["description","cause","year"],'Loc',{autoUpdate:'true'}) YIELD message RETURN message
           

CREATE (n:Loc {name:'V'})  SET n.description='測試中文分詞,複聯終章快上映了好激動,據說知識圖譜與人工智能技術應用到了那部電影!',n.cause='測試英文分詞,Mobile World Congress, the world’s largest gathering for the mobile industry, ' RETURN n
           

添加全文檢索之後就可以檢索:

CALL zdr.index.chineseFulltextIndexSearch('IKAnalyzer', 'description:吖啶基氨基甲烷磺酰甲氧基苯胺', 100) YIELD node RETURN node
           

重新索引之後才能檢索到:

CALL zdr.index.chineseFulltextIndexSearch('IKAnalyzer', 'description:測試~', 100) YIELD node RETURN node
           

addChineseFulltextAutoIndex/addChineseFulltextIndex支援多标簽的同時檢索,在建立索引時使用相同的索引名即可。

标簽:Loc

CALL zdr.index.addChineseFulltextAutoIndex('Loc',["description","cause","name"],'Loc',{autoUpdate:'true'}) YIELD message RETURN message
           

标簽:LocProvince’

CALL zdr.index.addChineseFulltextAutoIndex('Loc',["description","cause","name"],'LocProvince',{autoUpdate:'true'}) YIELD message RETURN message
           

檢索節點:

CALL apoc.index.search('Loc', 'name:p~') YIELD node RETURN node
           
NEO4J中文分詞全文索引自動更新解決方案

為了支援單節點的索引更新,開發以下過程。(三中所描述的自動更新方案失敗,轉為在更新節點或者建立節點的時候同步更新到對應的全文索引中。)

CALL apoc.index.remove('Loc')
CALL zdr.index.addChineseFulltextIndex('Loc',["description","cause","year"],'Loc') YIELD message RETURN message
           

CREATE (n:Loc {name:'V'})  SET n.description='測試中文分詞,複聯終章快上映了好激動,據說知識圖譜與人工智能技術應用到了那部電影!',n.cause='測試英文分詞,Mobile World Congress, the world’s largest gathering for the mobile industry, ' RETURN n
           

MATCH (n) WHERE n.name='V' WITH n CALL zdr.index.addNodeChineseFulltextIndex(n, ['description']) RETURN *
           

CALL zdr.index.chineseFulltextIndexSearch('Loc', 'description:測試中文~') YIELD node RETURN node
           
NEO4J中文分詞全文索引自動更新解決方案

如果配置了事務送出逾時設定,在建構索引時取消。

#********************************************************************
### Neo4j transcation timeout
###******************************************************************
#dbms.transaction.timeout=180s
           

使用背景腳本執行建構索引程式:

# index.sh
#!/usr/bin/env bash
nohup /neo4j-community-3.4.9/bin/neo4j-shell -file build.cql >>indexGraph.log 2>&1 &
           
// build.cql
CALL zdr.index.addChineseFulltextIndex('IKAnalyzer', ['description','fullname','name','lnkurl'], 'LinkedinID') YIELD message RETURN message;
           

如果使用APOC自帶的過程,設定自動更新配置之後即可,但是會影響性能。

apoc.autoIndex.enabled=true
           
// 建構示例
CALL apoc.index.addAllNodes('Loc', {Loc:["description","cause","year"]},{autoUpdate:true})
           

上述所有涉及到的NEO4J自定義過程參考

原文位址:https://blog.csdn.net/superman_xxx/article/details/89486277                   </div>