【发布时间】:2017-10-04 11:38:49
【问题描述】:
我是 hibernate lucene 搜索的新手。从病房的几天开始,我正在研究带有特殊字符的搜索关键字。我正在使用 MultiFieldQueryParser 进行精确的短语匹配以及布尔搜索。但是在这个过程中,我无法使用“拥有 1 年以上的经验”之类的搜索关键字获得结果,如果我没有在搜索关键字周围加上任何引号,那么我就会得到结果。所以我在执行 lucene 查询时观察到的是,它正在转义特殊符号(+)。我正在使用 StandardAnalyzer.class。我认为,如果我使用 WhiteSpaceAnalyzer,它不会转义特殊字符,但它可能会影响像 +java +php(即 java 和 php)这样的布尔搜索,因为它可能会被视为普通文本。所以请提供一些建议。
以下是我的sn-p:
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();
【问题讨论】: