Lucene 通过带html标记的富文本在Neo4j上进行全文搜索
在我的Neo4j应用程序中,我有一个Lucene 通过带html标记的富文本在Neo4j上进行全文搜索,lucene,neo4j,spring-data-neo4j,Lucene,Neo4j,Spring Data Neo4j,在我的Neo4j应用程序中,我有一个产品实体,其中包含名称和描述字段。这两个字段都用于Lucene上的传统索引 Product.name是一个简单的文本,这里没有问题,但是Product.description可以包含HTML标记和元素 现在我使用StandardAnalyzer(Version.LUCENE_36)作为索引。我应该使用什么分析器来跳过所有HTML元素 如何告诉Neo4J Lucene索引不要在Product.description中使用任何HTML元素?我只想给单词编索引 更新
产品
实体,其中包含名称
和描述
字段。这两个字段都用于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);
}
}
是HTMLStripCharFilter
初始化的适当位置
如果我错了,请纠正我。我添加了以下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();
}
}
@PostConstruct
公共void init(){
GraphDatabaseService graphDb=template.getGraphDatabaseService();
try(事务t=graphDb.beginTx()){
Index autoIndex=graphDb.Index().forNodes(“node_auto_Index”);
graphDb.index().setConfiguration(自动索引,“类型”,“全文”);
graphDb.index().setConfiguration(自动索引,“to_lower_case”,“true”);
graphDb.index().setConfiguration(自动索引,“analyzer”,StandardAnalyzerV36.class.getName());
t、 成功();
}
}
并创建了以下类:
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);
}
}
公共最终类标准AnalyzerV36扩展了Analyzer{
专用分析仪;
公共标准分析器V36(){
analyzer=新标准分析仪(版本:LUCENE_36);
}
公共标准分析器V36(设置停止字){
analyzer=新的StandardAnalyzer(Version.LUCENE_36,stopWords);
}
@凌驾
公共最终令牌流令牌流(字符串字段名、读卡器){
返回analyzer.tokenStream(fieldName,新的HTMLStripCharFilter(CharReader.get(reader));
}
@凌驾
public final TokenStream reusableTokenStream(字符串字段名、读卡器)引发IOException{
返回analyzer.reusableTokenStream(字段名、读取器);
}
}
现在一切正常。希望它能帮助别人。祝你好运
@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);
}
}