使用html标记在富文本上对Neo4j进行全文搜索

时间:2015-04-04 14:47:58

标签: lucene neo4j spring-data-neo4j

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

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

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

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

更新:

我找到了以下课程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初始化的适当位置。

如果我错了,请纠正我。

1 个答案:

答案 0 :(得分:1)

我添加了以下init方法:

@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();
        }
    }

并创建了以下类:

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);
    }

}

现在一切都按预期工作了。希望它会帮助别人。祝你好运。