一、中文分詞插件
NEO4J中文全文索引,分詞組件使用IKAnalyzer。為了支持高版本LUCENE,IKAnalyzer需要做一些調整。
ELASTICSEARCH-IKAnlyzer 高版本實現參考
1、分詞組件的調整
調整之后的分詞組件 casia.isiteam.zdr.wltea
// 調整之后的實現
public final class IKAnalyzer extends Analyzer {
<span class="token comment"><span class="hljs-comment"><span class="hljs-comment"><span class="hljs-comment">// 默認細粒度切分 true-智能切分 false-細粒度切分</span></span></span></span>
<span class="token keyword"><span class="hljs-keyword"><span class="hljs-keyword"><span class="hljs-keyword">private</span></span></span></span> Configuration configuration <span class="token operator">=</span> <span class="token keyword"><span class="hljs-keyword"><span class="hljs-keyword"><span class="hljs-keyword">new</span></span></span></span> <span class="token class-name">Configuration</span><span class="token punctuation">(</span><span class="token boolean"><span class="hljs-keyword"><span class="hljs-keyword"><span class="hljs-keyword">false</span></span></span></span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token comment"><span class="hljs-comment"><span class="hljs-comment"><span class="hljs-comment">/**
* IK分詞器Lucene Analyzer接口實現類
* <p>
* 默認細粒度切分算法
*/</span></span></span></span>
<span class="token keyword"><span class="hljs-function"><span class="hljs-keyword"><span class="hljs-function"><span class="hljs-keyword"><span class="hljs-function"><span class="hljs-keyword">public</span></span></span></span></span></span></span><span class="hljs-function"><span class="hljs-function"><span class="hljs-function"> </span></span></span><span class="token function"><span class="hljs-function"><span class="hljs-title"><span class="hljs-function"><span class="hljs-title"><span class="hljs-function"><span class="hljs-title">IKAnalyzer</span></span></span></span></span></span></span><span class="token punctuation"><span class="hljs-function"><span class="hljs-params"><span class="hljs-function"><span class="hljs-params"><span class="hljs-function"><span class="hljs-params">(</span></span></span></span></span></span></span><span class="token punctuation"><span class="hljs-function"><span class="hljs-params"><span class="hljs-function"><span class="hljs-params"><span class="hljs-function"><span class="hljs-params">)</span></span></span></span></span></span></span><span class="hljs-function"><span class="hljs-function"><span class="hljs-function"> </span></span></span><span class="token punctuation">{</span>
<span class="token punctuation">}</span>
<span class="token comment"><span class="hljs-comment"><span class="hljs-comment"><span class="hljs-comment">/**
* IK分詞器Lucene Analyzer接口實現類
*
* </span></span><span class="hljs-doctag"><span class="hljs-comment"><span class="hljs-doctag"><span class="hljs-comment"><span class="hljs-doctag">@param</span></span></span></span></span><span class="hljs-comment"><span class="hljs-comment"> configuration IK配置
*/</span></span></span></span>
<span class="token keyword"><span class="hljs-function"><span class="hljs-keyword"><span class="hljs-function"><span class="hljs-keyword"><span class="hljs-function"><span class="hljs-keyword">public</span></span></span></span></span></span></span><span class="hljs-function"><span class="hljs-function"><span class="hljs-function"> </span></span></span><span class="token function"><span class="hljs-function"><span class="hljs-title"><span class="hljs-function"><span class="hljs-title"><span class="hljs-function"><span class="hljs-title">IKAnalyzer</span></span></span></span></span></span></span><span class="token punctuation"><span class="hljs-function"><span class="hljs-params"><span class="hljs-function"><span class="hljs-params"><span class="hljs-function"><span class="hljs-params">(</span></span></span></span></span></span></span><span class="hljs-function"><span class="hljs-params"><span class="hljs-function"><span class="hljs-params"><span class="hljs-function"><span class="hljs-params">Configuration configuration</span></span></span></span></span></span><span class="token punctuation"><span class="hljs-function"><span class="hljs-params"><span class="hljs-function"><span class="hljs-params"><span class="hljs-function"><span class="hljs-params">)</span></span></span></span></span></span></span><span class="hljs-function"><span class="hljs-function"><span class="hljs-function"> </span></span></span><span class="token punctuation">{</span>
<span class="token keyword"><span class="hljs-keyword"><span class="hljs-keyword"><span class="hljs-keyword">super</span></span></span></span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token keyword"><span class="hljs-keyword"><span class="hljs-keyword"><span class="hljs-keyword">this</span></span></span></span><span class="token punctuation">.</span>configuration <span class="token operator">=</span> configuration<span class="token punctuation">;</span>
<span class="token punctuation">}</span>
<span class="token comment"><span class="hljs-comment"><span class="hljs-comment"><span class="hljs-comment">/**
* 重載Analyzer接口,構造分詞組件
*/</span></span></span></span>
<span class="token annotation punctuation"><span class="hljs-meta"><span class="hljs-meta"><span class="hljs-meta">@Override</span></span></span></span>
<span class="token keyword"><span class="hljs-function"><span class="hljs-keyword"><span class="hljs-function"><span class="hljs-keyword"><span class="hljs-function"><span class="hljs-keyword">protected</span></span></span></span></span></span></span><span class="hljs-function"><span class="hljs-function"><span class="hljs-function"> TokenStreamComponents </span></span></span><span class="token function"><span class="hljs-function"><span class="hljs-title"><span class="hljs-function"><span class="hljs-title"><span class="hljs-function"><span class="hljs-title">createComponents</span></span></span></span></span></span></span><span class="token punctuation"><span class="hljs-function"><span class="hljs-params"><span class="hljs-function"><span class="hljs-params"><span class="hljs-function"><span class="hljs-params">(</span></span></span></span></span></span></span><span class="hljs-function"><span class="hljs-params"><span class="hljs-function"><span class="hljs-params"><span class="hljs-function"><span class="hljs-params">String fieldName</span></span></span></span></span></span><span class="token punctuation"><span class="hljs-function"><span class="hljs-params"><span class="hljs-function"><span class="hljs-params"><span class="hljs-function"><span class="hljs-params">)</span></span></span></span></span></span></span><span class="hljs-function"><span class="hljs-function"><span class="hljs-function"> </span></span></span><span class="token punctuation">{</span>
Tokenizer _IKTokenizer <span class="token operator">=</span> <span class="token keyword"><span class="hljs-keyword"><span class="hljs-keyword"><span class="hljs-keyword">new</span></span></span></span> <span class="token class-name">IKTokenizer</span><span class="token punctuation">(</span>configuration<span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token keyword"><span class="hljs-keyword"><span class="hljs-keyword"><span class="hljs-keyword">return</span></span></span></span> <span class="token keyword"><span class="hljs-keyword"><span class="hljs-keyword"><span class="hljs-keyword">new</span></span></span></span> <span class="token class-name">TokenStreamComponents</span><span class="token punctuation">(</span>_IKTokenizer<span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span>
}
2、分詞測試
自定義分詞函數
RETURN zdr.index.iKAnalyzer('復聯終章快上映了好激動,據說知識圖譜與人工智能技術應用到了那部電影!吖啶基氨基甲烷磺酰甲氧基苯胺是一種葯嘛?',true) AS words
/** * @param text:待分詞文本 * @param useSmart:true 用智能分詞,false 細粒度分詞 * @return * @Description: TODO(支持中英文本分詞) */
@UserFunction(name = "zdr.index.iKAnalyzer")
@Description("Fulltext index iKAnalyzer - RETURN zdr.index.iKAnalyzer({text},true) AS words")
public List<String> iKAnalyzer(@Name("text") String text, @Name("useSmart") boolean useSmart) {
PropertyConfigurator<span class="token punctuation">.</span><span class="token function">configureAndWatch</span><span class="token punctuation">(</span><span class="token string"><span class="hljs-string"><span class="hljs-string"><span class="hljs-string">"dic"</span></span></span></span> <span class="token operator">+</span> File<span class="token punctuation">.</span>separator <span class="token operator">+</span> <span class="token string"><span class="hljs-string"><span class="hljs-string"><span class="hljs-string">"log4j.properties"</span></span></span></span><span class="token punctuation">)</span><span class="token punctuation">;</span>
Configuration cfg <span class="token operator">=</span> <span class="token keyword"><span class="hljs-keyword"><span class="hljs-keyword"><span class="hljs-keyword">new</span></span></span></span> <span class="token class-name">Configuration</span><span class="token punctuation">(</span>useSmart<span class="token punctuation">)</span><span class="token punctuation">;</span>
StringReader input <span class="token operator">=</span> <span class="token keyword"><span class="hljs-keyword"><span class="hljs-keyword"><span class="hljs-keyword">new</span></span></span></span> <span class="token class-name">StringReader</span><span class="token punctuation">(</span>text<span class="token punctuation">.</span><span class="token function">trim</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
IKSegmenter ikSegmenter <span class="token operator">=</span> <span class="token keyword"><span class="hljs-keyword"><span class="hljs-keyword"><span class="hljs-keyword">new</span></span></span></span> <span class="token class-name">IKSegmenter</span><span class="token punctuation">(</span>input<span class="token punctuation">,</span> cfg<span class="token punctuation">)</span><span class="token punctuation">;</span>
List<span class="token generics function"><span class="token punctuation"><</span>String<span class="token punctuation">></span></span> results <span class="token operator">=</span> <span class="token keyword"><span class="hljs-keyword"><span class="hljs-keyword"><span class="hljs-keyword">new</span></span></span></span> <span class="token class-name">ArrayList</span><span class="token operator"><</span><span class="token operator">></span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token keyword"><span class="hljs-keyword"><span class="hljs-keyword"><span class="hljs-keyword">try</span></span></span></span> <span class="token punctuation">{</span>
<span class="token keyword"><span class="hljs-keyword"><span class="hljs-keyword"><span class="hljs-keyword">for</span></span></span></span> <span class="token punctuation">(</span>Lexeme lexeme <span class="token operator">=</span> ikSegmenter<span class="token punctuation">.</span><span class="token function">next</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span> lexeme <span class="token operator">!=</span> <span class="hljs-keyword"><span class="hljs-keyword"><span class="hljs-keyword">null</span></span></span><span class="token punctuation">;</span> lexeme <span class="token operator">=</span> ikSegmenter<span class="token punctuation">.</span><span class="token function">next</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">)</span> <span class="token punctuation">{</span>
results<span class="token punctuation">.</span><span class="token function">add</span><span class="token punctuation">(</span>lexeme<span class="token punctuation">.</span><span class="token function">getLexemeText</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span>
<span class="token punctuation">}</span> <span class="token keyword"><span class="hljs-keyword"><span class="hljs-keyword"><span class="hljs-keyword">catch</span></span></span></span> <span class="token punctuation">(</span><span class="token class-name">IOException</span> e<span class="token punctuation">)</span> <span class="token punctuation">{</span>
e<span class="token punctuation">.</span><span class="token function">printStackTrace</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span>
<span class="token keyword"><span class="hljs-keyword"><span class="hljs-keyword"><span class="hljs-keyword">return</span></span></span></span> results<span class="token punctuation">;</span>
<span class="token punctuation">}</span>
二、樣例數據准備
# 構造樣例數據
MERGE (a:Loc {name:'A'}) SET a.description='復聯終章快上映了好激動,據說知識圖譜與人工智能技術應用到了那部電影!吖啶基氨基甲烷磺酰甲氧基苯胺是一種葯嘛?'
MERGE (b:Loc {name:'B'}) SET b.description='復聯終章快上映了好激動,據說知識圖譜與人工智能技術應用到了那部電影!吖啶基氨基甲烷磺酰甲氧基苯胺是一種葯嘛?'
MERGE (c:Loc {name:'C'}) SET c.description='復聯終章快上映了好激動,據說知識圖譜與人工智能技術應用到了那部電影!吖啶基氨基甲烷磺酰甲氧基苯胺是一種葯嘛?'
MERGE (d:Loc {name:'D'}) SET d.description='復聯終章快上映了好激動,據說知識圖譜與人工智能技術應用到了那部電影!吖啶基氨基甲烷磺酰甲氧基苯胺是一種葯嘛?'
MERGE (e:Loc {name:'E'}) SET e.description='復聯終章快上映了好激動,據說知識圖譜與人工智能技術應用到了那部電影!吖啶基氨基甲烷磺酰甲氧基苯胺是一種葯嘛?'
MERGE (f:Loc {name:'F'}) SET f.description='復聯終章快上映了好激動,據說知識圖譜與人工智能技術應用到了那部電影!吖啶基氨基甲烷磺酰甲氧基苯胺是一種葯嘛?'
MERGE (a)-[:ROAD {cost:50}]->(b)
MERGE (a)-[:ROAD {cost:50}]->(c)
MERGE (a)-[:ROAD {cost:100}]->(d)
MERGE (b)-[:ROAD {cost:40}]->(d)
MERGE (c)-[:ROAD {cost:40}]->(d)
MERGE (c)-[:ROAD {cost:80}]->(e)
MERGE (d)-[:ROAD {cost:30}]->(e)
MERGE (d)-[:ROAD {cost:80}]->(f)
MERGE (e)-[:ROAD {cost:40}]->(f);
三、通過中文全文分詞組件創建節點索引
自定義創建索引過程
CALL zdr.index.addChineseFulltextIndex('IKAnalyzer', 'Loc', ['description']) YIELD message RETURN message
@Procedure(value = "zdr.index.addChineseFulltextIndex", mode = Mode.WRITE)
@Description("CALL zdr.index.addChineseFulltextIndex(String indexName, String labelName, List<String> propKeys) YIELD message RETURN message," +
"為一個標簽下的所有節點的指定屬性添加索引")
public Stream<NodeIndexMessage> addChineseFulltextIndex(@Name("indexName") String indexName, @Name("labelName") String labelName, @Name("properties") List<String> propKeys) {
Label label = Label.label(labelName);
List<span class="token generics function"><span class="token punctuation"><</span>NodeIndexMessage<span class="token punctuation">></span></span> output <span class="token operator">=</span> <span class="token keyword"><span class="hljs-keyword"><span class="hljs-keyword"><span class="hljs-keyword">new</span></span></span></span> <span class="token class-name">ArrayList</span><span class="token operator"><</span><span class="token operator">></span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
// // 按照標簽找到該標簽下的所有節點
ResourceIterator<Node> nodes = db.findNodes(label);
System.out.println("nodes:" + nodes.toString());
<span class="token keyword"><span class="hljs-keyword"><span class="hljs-keyword"><span class="hljs-keyword">int</span></span></span></span> nodesSize <span class="token operator">=</span> <span class="token number"><span class="hljs-number"><span class="hljs-number"><span class="hljs-number">0</span></span></span></span><span class="token punctuation">;</span>
<span class="token keyword"><span class="hljs-keyword"><span class="hljs-keyword"><span class="hljs-keyword">int</span></span></span></span> propertiesSize <span class="token operator">=</span> <span class="token number"><span class="hljs-number"><span class="hljs-number"><span class="hljs-number">0</span></span></span></span><span class="token punctuation">;</span>
<span class="token keyword"><span class="hljs-keyword"><span class="hljs-keyword"><span class="hljs-keyword">while</span></span></span></span> <span class="token punctuation">(</span>nodes<span class="token punctuation">.</span><span class="token function">hasNext</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">)</span> <span class="token punctuation">{</span>
nodesSize<span class="token operator">++</span><span class="token punctuation">;</span>
Node node <span class="token operator">=</span> nodes<span class="token punctuation">.</span><span class="token function">next</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
System<span class="token punctuation">.</span>out<span class="token punctuation">.</span><span class="token function">println</span><span class="token punctuation">(</span><span class="token string"><span class="hljs-string"><span class="hljs-string"><span class="hljs-string">"current nodes:"</span></span></span></span> <span class="token operator">+</span> node<span class="token punctuation">.</span><span class="token function">toString</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token comment"><span class="hljs-comment"><span class="hljs-comment"><span class="hljs-comment">// 每個節點上需要添加索引的屬性</span></span></span></span>
Set<span class="token operator"><</span>Map<span class="token punctuation">.</span>Entry<span class="token generics function"><span class="token punctuation"><</span>String<span class="token punctuation">,</span> Object<span class="token punctuation">></span></span><span class="token operator">></span> properties <span class="token operator">=</span> node<span class="token punctuation">.</span><span class="token function">getProperties</span><span class="token punctuation">(</span>propKeys<span class="token punctuation">.</span><span class="token function">toArray</span><span class="token punctuation">(</span><span class="token keyword"><span class="hljs-keyword"><span class="hljs-keyword"><span class="hljs-keyword">new</span></span></span></span> <span class="token class-name">String</span><span class="token punctuation">[</span><span class="token number"><span class="hljs-number"><span class="hljs-number"><span class="hljs-number">0</span></span></span></span><span class="token punctuation">]</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">.</span><span class="token function">entrySet</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
System<span class="token punctuation">.</span>out<span class="token punctuation">.</span><span class="token function">println</span><span class="token punctuation">(</span><span class="token string"><span class="hljs-string"><span class="hljs-string"><span class="hljs-string">"current node properties"</span></span></span></span> <span class="token operator">+</span> properties<span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token comment"><span class="hljs-comment"><span class="hljs-comment"><span class="hljs-comment">// 查詢該節點是否已有索引,有的話刪除</span></span></span></span>
Index<span class="token generics function"><span class="token punctuation"><</span>Node<span class="token punctuation">></span></span> index <span class="token operator">=</span> db<span class="token punctuation">.</span><span class="token function">index</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">.</span><span class="token function">forNodes</span><span class="token punctuation">(</span>indexName<span class="token punctuation">,</span> FULL_INDEX_CONFIG<span class="token punctuation">)</span><span class="token punctuation">;</span>
System<span class="token punctuation">.</span>out<span class="token punctuation">.</span><span class="token function">println</span><span class="token punctuation">(</span><span class="token string"><span class="hljs-string"><span class="hljs-string"><span class="hljs-string">"current node index"</span></span></span></span> <span class="token operator">+</span> index<span class="token punctuation">)</span><span class="token punctuation">;</span>
index<span class="token punctuation">.</span><span class="token function">remove</span><span class="token punctuation">(</span>node<span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token comment"><span class="hljs-comment"><span class="hljs-comment"><span class="hljs-comment">// 為了該節點的每個需要添加索引的屬性添加全文索引</span></span></span></span>
<span class="token keyword"><span class="hljs-keyword"><span class="hljs-keyword"><span class="hljs-keyword">for</span></span></span></span> <span class="token punctuation">(</span>Map<span class="token punctuation">.</span>Entry<span class="token generics function"><span class="token punctuation"><</span>String<span class="token punctuation">,</span> Object<span class="token punctuation">></span></span> property <span class="token operator">:</span> properties<span class="token punctuation">)</span> <span class="token punctuation">{</span>
propertiesSize<span class="token operator">++</span><span class="token punctuation">;</span>
index<span class="token punctuation">.</span><span class="token function">add</span><span class="token punctuation">(</span>node<span class="token punctuation">,</span> property<span class="token punctuation">.</span><span class="token function">getKey</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">,</span> property<span class="token punctuation">.</span><span class="token function">getValue</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span>
<span class="token punctuation">}</span>
String message <span class="token operator">=</span> <span class="token string"><span class="hljs-string"><span class="hljs-string"><span class="hljs-string">"IndexName:"</span></span></span></span> <span class="token operator">+</span> indexName <span class="token operator">+</span> <span class="token string"><span class="hljs-string"><span class="hljs-string"><span class="hljs-string">",LabelName:"</span></span></span></span> <span class="token operator">+</span> labelName <span class="token operator">+</span> <span class="token string"><span class="hljs-string"><span class="hljs-string"><span class="hljs-string">",NodesSize:"</span></span></span></span> <span class="token operator">+</span> nodesSize <span class="token operator">+</span> <span class="token string"><span class="hljs-string"><span class="hljs-string"><span class="hljs-string">",PropertiesSize:"</span></span></span></span> <span class="token operator">+</span> propertiesSize<span class="token punctuation">;</span>
NodeIndexMessage indexMessage <span class="token operator">=</span> <span class="token keyword"><span class="hljs-keyword"><span class="hljs-keyword"><span class="hljs-keyword">new</span></span></span></span> <span class="token class-name">NodeIndexMessage</span><span class="token punctuation">(</span>message<span class="token punctuation">)</span><span class="token punctuation">;</span>
output<span class="token punctuation">.</span><span class="token function">add</span><span class="token punctuation">(</span>indexMessage<span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token keyword"><span class="hljs-keyword"><span class="hljs-keyword"><span class="hljs-keyword">return</span></span></span></span> output<span class="token punctuation">.</span><span class="token function">stream</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span>
四、中文分詞索引查詢
自定義查詢索引過程
CALL zdr.index.chineseFulltextIndexSearch('IKAnalyzer', 'description:吖啶基氨基甲烷磺酰甲氧基苯胺', 100) YIELD node RETURN node
CALL zdr.index.chineseFulltextIndexSearch('IKAnalyzer', 'description:復聯* AND year:1999', 100) YIELD node,weight RETURN node.name,node.year,node.description,weight
- 1
@Procedure(value = "zdr.index.chineseFulltextIndexSearch", mode = Mode.WRITE)
@Description("CALL zdr.index.chineseFulltextIndexSearch(String indexName, String query, long limit) YIELD node RETURN node," +
"執行LUCENE全文檢索,返回前{limit個結果}")
public Stream<ChineseHit> chineseFulltextIndexSearch(@Name("indexName") String indexName, @Name("query") String query, @Name("limit") long limit) {
if (!db.index().existsForNodes(indexName)) {
log.debug("如果索引不存在則跳過本次查詢:`%s`", indexName);
return Stream.empty();
}
return db.index()
.forNodes(indexName, FULL_INDEX_CONFIG)
.query(new QueryContext(query).sortByScore().top((int) limit))
.stream()
.map(ChineseHit::new); // provider
}
【跨標簽類型檢索】使用addChineseFulltextIndex給標簽下節點屬性添加的索引,默認可以使用chineseFulltextIndexSearch合並檢索出來
// 增加一個非Loc標簽的節點,然后使用檢索
CREATE (n:LocProvince {name:'P'}) SET n.description='復聯終章快上映了好激動,據說知識圖譜與人工智能技術應用到了那部電影!' RETURN n
// 節點增加索引(索引名與已有相同)
CALL zdr.index.addChineseFulltextIndex('IKAnalyzer', 'LocProvince', ['description','year']) YIELD message RETURN message
// 通過屬性檢索節點
CALL zdr.index.chineseFulltextIndexSearch('IKAnalyzer', 'description:復聯', 100) YIELD node,weight RETURN node
五、總結
上述NEO4J中文全文索引解決方法,索引不會自動更新,修改節點屬性以及新增節點時都需要重新建立索引。
NEO4J默認索引實現參考:neo4j-lucene-index