我是hibernate lucene搜索的新手。从病房的几天开始,我正在使用特殊字符搜索关键字。我正在使用MultiFieldQueryParser进行精确的词组匹配以及布尔搜索。但在这个过程中,我无法使用“拥有1年以上的经验”等搜索关键字来获得搜索结果,如果我没有在搜索关键字周围添加任何引号,那么我会得到结果。所以我在执行lucene查询时观察到的是,它正在逃避特殊符号(+)。我正在使用StandardAnalyzer.class。我认为,如果我使用的是WhiteSpaceAnalyzer,它不会转义特殊字符,但它可能会影响布尔搜索,如+ java + php(即java和php),因为它可能会视为普通文本。所以请协助一些建议。如何在hibernate搜索中搜索特殊字符?
以下是我的代码片段:
Session session = getSession();
FullTextSession fullTextSession = Search.getFullTextSession(session);
MultiFieldQueryParser parser = new MultiFieldQueryParser(new String[] { "student.skills.skill",
"studentProfileSummary.profileTitle", "studentProfileSummary.currentDesignation" },
new StandardAnalyzer());
parser.setDefaultOperator(Operator.OR);
org.apache.lucene.search.Query luceneQuery = null;
QueryBuilder qb = fullTextSession.getSearchFactory().buildQueryBuilder().forEntity(Student.class).get();
BooleanQuery boolQuery = new BooleanQuery();
if (StringUtils.isEmpty(zipcode) != true && StringUtils.isBlank(zipcode) != true) {
boolQuery.add(
qb.keyword().onField("personal.locations.postalCode").matching(zipcode).createQuery(),
BooleanClause.Occur.MUST);
}
if (StringUtils.isEmpty(query) != true && StringUtils.isBlank(query) != true) {
try {
luceneQuery = parser.parse(query.toUpperCase());
} catch (ParseException e) {
luceneQuery = parser.parse(parser.escape(query.toUpperCase()));
}
boolQuery.add(luceneQuery, BooleanClause.Occur.MUST);
}
boolQuery.add(qb.keyword().onField("vStatus").matching(1).createQuery(), BooleanClause.Occur.MUST);
boolQuery.add(qb.keyword().onField("status").matching(1).createQuery(), BooleanClause.Occur.MUST);
boolQuery.add(qb.range().onField("studentProfileSummary.profilePercentage").from(80).to(100).createQuery(),
BooleanClause.Occur.MUST);
FullTextQuery createFullTextQuery = fullTextSession.createFullTextQuery(boolQuery, Student.class);
createFullTextQuery.setProjection("id", "studentProfileSummary.profileTitle", "firstName","lastName");
if (isEmptyFilter == false) {
createFullTextQuery.setFirstResult((int) pageNumber);
createFullTextQuery.setMaxResults((int) end);
}
return createFullTextQuery.list();
@ Sanne.Tq为您的答复。在我的数据库中,我有一个名为profile title的字段。所以现在我想要得到的结果是我的搜索关键字匹配的地方。它不应该匹配字符串“6年“只有它必须得到匹配字符串”拥有1年以上的经验“。 – Satya