在带有 html 标记的富文本上对 Neo4j 进行全文搜索
Full text search on Neo4j over rich text with html markup
在我的 Neo4j 应用程序中,我有一个带有 name
和 description
字段的 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);
}
}
现在一切正常。希望它能帮助别人。祝你好运。
在我的 Neo4j 应用程序中,我有一个带有 name
和 description
字段的 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);
}
}
现在一切正常。希望它能帮助别人。祝你好运。