neo4j包含schema indexes 和 legacy indexes两种类型,二者理念不一样且不可互换或兼容,实际应用中应明确检索需求后采用合适的索引。html
参考neo4j index-confusionnode
schema index和legacy index 都是基于lucene实现;git
若是你正在使用Neo4j 2.0或者更高版本而且不须要支持2.0版本以前legacy index的代码,那么请只使用schema index同时避免legacy index;github
若是你不得不使用Neo4j的早期版本,而且没法升级,不管如何你都只有一种索引能够选择(legacy index);sql
若是你须要全文检索的索引,无论是什么版本,都将使用legacy index。spa
`Neo4j is a schema-optional graph database. You can use Neo4j without any schema. Optionally you can introduce it in order to gain performance or modeling benefits.
This allows a way of working where the schema does not get in your way until you are at a stage where you want to reap the benefits of having one.`code
在Neo4j 2.0版本以前,Legacy index被称做indexes。这个索引是在graph外部经过Lucene实现,容许“节点”和“关系”以键值对的形式被检索。从Neo4j 提供的REST接口来看,被称做index
的变量一般是指Legacy indexes;orm
Legacy index可以提供全文本检索的能力。这个功能并无在schema index中被提供,这也是Neo4j 2.0* 版本保留legacy indexes的缘由之一。htm
create index on :Node(property),会对指定label property的全部node新建index ,index新建成功后,当graph更新时index会自动更新,index默认存储在根目录的/schema/index/lucene目录;
如:索引
# 新建索引 CREATE INDEX ON :AddressNode( preAddressNodeGUIDs) # 删除索引 DROP INDEX ON :AddressNode(_id)
schema index存储方式为复合索引(Compound Index),除了段信息文件,锁文件,以及删除的文件外,其余的一系列索引文件压缩一个后缀名为cfs的文件,即全部的索引文件会被存储成一个单例的Directory,
此方式有助于减小索引文件数量,减小同时打开的文件数量,从而获取更高的效率。好比说,查询频繁,而不常常更新的需求,就很适合这种索引格式。
参数 | 值 | 描述 |
---|---|---|
type | exact, fulltext | exact采用Lucene keyword analyzer是默认配置. fulltext采用white-space tokenizer in its analyzer. |
to_lower_case | true, false | type=fulltext时生效,在新建索引和查询时会自动进行字母的大小写转换,默认为小写 |
analyzer | Analyzer类全名 | 自定义Lucene Analyzer,注意:to_lower_case配置会默认将查询参数转换为小写.若是自定义analyzer索引写入的字母为大写,查询结果将会不匹配 |
分exact和fulltext两类,二者可结合使用,可新建relationship索引,默认存储在根目录的index/lucene目录;
fulltext索引新建方式参考笔记Neo4j中实现自定义中文全文索引
注意:使用legacy index查询每每须要一个start node;
legacy index采用非复合索引,更灵活,能够单独的访问某几个索引文件
参考:https://dzone.com/articles/indexing-neo4j-overview
Neo4j不支持联合索引,可采用拼接字段实现
Neo4j 3.0开始支持联合索引,但须要升级至JDK8
https://github.com/neo4j/neo4j/issues/6841