我正在尝试在我的hibernate查询中搜索特殊字符,我使用QueryParser.escape(String searchTerm)在所有特殊字符前放置一个'\'字符以正确地转义它们。
但是我发现用于标记化的标准分析器会从索引中删除这些特殊字符,所以即使你正确地逃避术语'abc-def',如果你尝试搜索它,你也必须搜索'abc def ”。
那么我应该使用什么样的分析器/如何指定分析器在索引时不要删除特殊字符?
我在下面注释的类和查询构建的片段:
@Entity
@Table(name="jobReq")
@Indexed
public class JobReq {
@Id
@DocumentId
@GeneratedValue(strategy=GenerationType.IDENTITY)
private Integer id;
@Field
@Column(name="jobId", nullable=false, unique=true)
private String jobId;
@Fields({@Field, @Field(name = "jobIdSort", analyze = Analyze.NO)})
@Column(name="jobIdSort", nullable=false, unique=true)
private String jobIdSort;
@Field
@Column(name="jobTitle", nullable=false)
private String jobTitle;
查询:
tempQ = (org.apache.lucene.search.Query) qb.keyword()
.wildcard()
.onField(allFields[i].getName().toString())
.matching(QueryParser.escape(termToFind) + "*")
.createQuery();
}
bq.add(new BooleanClause(tempQ, BooleanClause.Occur.SHOULD));
}
}
}
//wrap Lucene query in an org.hibernate.Query
hibQuery = fullTextSession.createFullTextQuery(bq, this.type).setSort(sort);
results = hibQuery.list();
System.out.println(bq);
fullTextSession.getTransaction().commit();
答案 0 :(得分:0)
在这种情况下,我认为使用QueryParser.escape
没有任何意义。这旨在转义字符串形式的查询以准备解析。您没有使用QueryParser
,并在评论中说明了您不打算这样做。你提到你已经尝试过关键字分析器了。我怀疑问题是你 通过QueryParser.escape
方法运行它,并且在这个上下文中添加了一个无关的反斜杠,阻止了匹配。
如果您倾向于使用QueryParser并利用分析,您可能会创建如下内容:
SearchFactory searchFactory = fullTextSession.getSearchFactory();
org.apache.lucene.queryParser.QueryParser parser = new QueryParser(defaultField, searchFactory.getAnalyzer(JobReq.class) );
/*
create your BooleanQuery, loop, whatever else
*/
org.apache.lucene.search.Query query = parser.parse( allFields[i].getName().toString() + ":" + QueryParser.escape(termToFind) + "*" );
bq.add(new BooleanClause(tempQ, BooleanClause.Occur.SHOULD));
hibQuery = fullTextSession.createFullTextQuery(bq).setSort(sort);
results = hibQuery.list();