全文索引分析器提供者
全文索引总是带有一个分析器,它描述了文本如何进行索引和查询分析。分析器将文本分解成更小的标记,并使用过滤器处理这些标记。过滤器可以执行不同的操作,例如删除停用词(例如,the 和 is)、对标记进行词干提取或将其转换为小写。
使用哪种分析器取决于您希望索引的用途。例如,如果被索引的文本属于一个特殊领域,如电子邮件地址,您会希望使用该领域特定的分析器。或者如果文本始终是特定语言,如俄语,您可以使用该语言特定的分析器。
Neo4j 提供了多种内置分析器。通过调用 db.index.fulltext.listAvailableAnalyzers()
过程,可以获取完整的分析器列表。该过程返回分析器名称、简短描述以及分析器使用的完整停用词列表。
默认分析器是 standard-no-stop-words
分析器。可以通过 dbms.index.fulltext.default_analyzer
设置更改此默认值。此设置仅在创建全文索引时生效。全文索引创建后,它会在其索引特定设置中记住该分析器。
通过实现 AnalyzerProvider
,可以扩展 Neo4j 中可用的分析器。AnalyzerProvider
充当一个工厂,用于构建索引使用的具体 Lucene Analyzer
实例。以下示例创建了一个自定义分析器
public class CustomAnalyzerProvider extends AnalyzerProvider (1)
{
public CustomAnalyzerProvider() (2)
{
super( "custom-analyzer" ); (3)
}
@Override
public Analyzer createAnalyzer() (4)
{
try
{
return CustomAnalyzer.builder() (5)
.withTokenizer( StandardTokenizerFactory.class )
.addTokenFilter( LowerCaseFilterFactory.class )
.addTokenFilter( StopFilterFactory.class, "ignoreCase", "false", "words", "stopwords.txt", "format", "wordset" )
.build();
}
catch ( IOException e )
{
throw new UncheckedIOException( e );
}
}
}
1 | CustomAnalyzerProvider 类必须是 public 的,并且必须扩展 org.neo4j.graphdb.schema.AnalyzerProvider 类。 |
2 | CustomAnalyzerProvider 类还必须有一个不带参数的 public 构造函数。如果没有这个构造函数,Neo4j 将不会加载新的分析器提供者。由于此原因导致分析器提供者被忽略时,不会记录任何警告,请务必注意。 |
3 | 构造函数随后必须调用其超类构造函数,并将 custom-analyzer 提供者的名称作为参数传递。在配置索引时,将使用此名称来引用此分析器提供者。 |
4 | 最后,必须实现 createAnalyzer 方法。此方法创建并返回索引将使用的具体 Analyzer 实例。如果此方法返回 null 或抛出异常,索引将被标记为 FAILED。 |
5 | 此示例创建 Lucene 的 CustomAnalyzer 实例。但是,您可以创建并返回任何扩展 org.apache.lucene.analysis.Analyzer 类的对象。 |
请遵循 设置插件项目 中的指南,了解如何将自定义的 AnalyzerProvider
打包到可集成到 Neo4j 的 JAR 文件中。
分析器提供者通过服务加载被 Neo4j 发现。这意味着除了实现该类之外,您还必须将完全限定的类名添加到服务文件中,并将该文件放在类路径上。这些服务文件通常包含在包含 Neo4j 扩展的 JAR 文件中。在典型的 Maven 项目中,例如由 设置插件项目 创建的项目,目录结构将如下所示
project/
src/
main/
java/
my_package/
CustomAnalyzerProvider.java (1)
resources/
META-INF/
services/
org.neo4j.graphdb.schema.AnalyzerProvider (2)
1 | 这是我们之前代码示例中的 CustomAnalyzerProvider 。 |
2 | 这是服务加载器文件。它是一个纯文本文件,其中包含我们项目中实现的每个 AnalyzerProvider 的完全限定名称的行。在本例中,它包含一行:my_package.CustomAnalyzerProvider 。 |
为了使 META-INF/services
资源能够被 maven-shade-plugin
正确处理,可能需要将服务资源转换包含到插件配置中。这是一个示例,说明它可能是什么样子
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-shade-plugin</artifactId>
<executions>
<execution>
<goals>
<goal>shade</goal>
</goals>
<configuration>
<transformers>
<transformer implementation="org.apache.maven.plugins.shade.resource.ServicesResourceTransformer"/>
</transformers>
</configuration>
</execution>
</executions>
</plugin>
有关此步骤的更多详细信息,请查阅 Maven Shade Plugin 的文档。