全文索引分析器提供程序

全文索引始终具有分析器,它描述了如何分析文本以进行索引和查询。分析器将文本分解成更小的标记,并使用过滤器处理这些标记。过滤器可以执行不同的操作,例如删除停用词(例如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类的类。

按照设置插件项目中的指南,了解如何将自定义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

为了使maven-shade-plugin正确处理META-INF/services资源,可能需要将服务资源转换包含到插件配置中。这是一个示例,说明它可能是什么样子

<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的文档。