全文索引分析器提供程序

全文索引始终配备分析器,用于描述文本在索引和查询时如何被分析。分析器将文本拆分为更小的标记(token),并使用过滤器处理这些标记。过滤器可以执行不同的操作,例如删除停用词(例如 theis)、对标记进行词干提取,或将其转换为小写。

使用哪种分析器取决于你希望索引用于何种场景。例如,如果要索引的文本属于特定领域,如电子邮件地址,则应使用针对该领域的分析器。又或者,如果文本始终使用某种语言,例如俄语,则可以使用针对该语言的分析器。

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 类的对象。

请参照 Setting up a plugin project 中的指南,了解如何将自定义的 AnalyzerProvider 打包成可集成到 Neo4j 的 JAR 文件。

分析器提供者通过服务加载被 Neo4j 发现。这意味着除实现相应类外,还必须将完整类名添加到服务文件中,并将该文件放在类路径上。这些服务文件通常随包含 Neo4j 扩展的 JAR 文件一起打包。在典型的 Maven 项目中(例如通过 Setting up a plugin project 创建的项目),目录结构大致如下:

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

为了让 maven-shade-plugin 正确处理 META-INF/services 资源,可能需要在插件配置中加入服务资源转换(service resource transformation)。下面是一个示例:

<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 的文档,获取此步骤的更多细节。