在带有 html 标记的富文本上对 Neo4j 进行全文搜索

Full text search on Neo4j over rich text with html markup

在我的 Neo4j 应用程序中,我有一个带有 namedescription 字段的 Product 实体。这两个字段都用于 Lucene 的遗留索引。

Product.name 是一个简单的文本,这里没有问题,但 Product.description 可以包含 HTML 标记和元素。

现在我使用 StandardAnalyzer(Version.LUCENE_36) 作为我的索引。我应该使用什么分析器来跳过所有 HTML 元素?

如何告诉 Neo4J Lucene 索引不使用 Product.description 中的任何 HTML 元素?我只想索引单词。

更新:

我发现了以下 class HTMLStripCharFilter 并按如下方式重新实现了我的分析器:

public final class StandardAnalyzerV36 extends Analyzer {

    private Analyzer analyzer;

    public StandardAnalyzerV36() {
        analyzer = new StandardAnalyzer(Version.LUCENE_36);
    }

    public StandardAnalyzerV36(Set<?> stopWords) {
        analyzer = new StandardAnalyzer(Version.LUCENE_36, stopWords);
    }

    @Override
    public final TokenStream tokenStream(String fieldName, Reader reader) {
        return analyzer.tokenStream(fieldName, new HTMLStripCharFilter(CharReader.get(reader)));
    }

    @Override
    public final TokenStream reusableTokenStream(String fieldName, Reader reader) throws IOException {
        return analyzer.reusableTokenStream(fieldName, reader);
    }

}

我还为我的 Neo4j 项目添加了一个新的 Maven 依赖项:

<dependency>
    <groupId>org.apache.lucene</groupId>
    <artifactId>lucene-analyzers</artifactId>
    <version>3.6.2</version>
</dependency>

现在一切正常,但我不确定该方法

  @Override
    public final TokenStream tokenStream(String fieldName, Reader reader) {
        return analyzer.tokenStream(fieldName, new HTMLStripCharFilter(CharReader.get(reader)));
    }

HTMLStripCharFilter 初始化的合适位置。

如有错误请指正

我添加了以下初始化方法:

@PostConstruct
    public void init() {
        GraphDatabaseService graphDb = template.getGraphDatabaseService();
        try (Transaction t = graphDb.beginTx()) {
            Index<Node> autoIndex = graphDb.index().forNodes("node_auto_index");
            graphDb.index().setConfiguration(autoIndex, "type", "fulltext");
            graphDb.index().setConfiguration(autoIndex, "to_lower_case", "true");
            graphDb.index().setConfiguration(autoIndex, "analyzer", StandardAnalyzerV36.class.getName());
            t.success();
        }
    }

并创建了以下 class:

public final class StandardAnalyzerV36 extends Analyzer {

    private Analyzer analyzer;

    public StandardAnalyzerV36() {
        analyzer = new StandardAnalyzer(Version.LUCENE_36);
    }

    public StandardAnalyzerV36(Set<?> stopWords) {
        analyzer = new StandardAnalyzer(Version.LUCENE_36, stopWords);
    }

    @Override
    public final TokenStream tokenStream(String fieldName, Reader reader) {
        return analyzer.tokenStream(fieldName, new HTMLStripCharFilter(CharReader.get(reader)));
    }

    @Override
    public final TokenStream reusableTokenStream(String fieldName, Reader reader) throws IOException {
        return analyzer.reusableTokenStream(fieldName, reader);
    }

}

现在一切正常。希望它能帮助别人。祝你好运。