2015-04-04 27 views
3

在我的Neo4j應用程序中,我有一個Product實體,其中有一個namedescription字段。這兩個字段都用於Lucene的傳統索引。在Neo4j上使用html標記在富文本上進行全文搜索

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

} 

也是我添加了一個新的Maven dependecy我的Neo4j項目:

<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

我加入了以下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); 
    } 

} 

現在一切正常。希望它能幫助別人。祝你好運。