我是休眠搜索的新手。
我正在尝试实现一个结果完全匹配的引擎。
我的持久性类更改
@Field(index=Index.UN_TOKENIZED, store=Store.NO)
private String offerTitle;
实施变更
String[] offerFields = new String[] { "offerTitle"};
MultiFieldQueryParser parser = new MultiFieldQueryParser(Version.LUCENE_31,offerFields,new KeywordAnalyzer());
org.apache.lucene.search.Query query = parser.parse(queryString);
org.hibernate.Query offerHibQuery = fullTextSession.createFullTextQuery(query, Offer.class);
List<?> offerResults = offerHibQuery.list();
在搜索词中包含空格之前,它一直正常工作。当搜索词包含空格时,它不会得到任何结果。
例如:对于搜索字词:“Comcast offer name
”我没有结果,查询分为offerTitle:Comcast offerTitle:offer offerTitle:name
有没有办法搜索与空格完全匹配?
我试过了:
QueryBuilder queryBuilder_1 = fullTextSession.getSearchFactory().buildQueryBuilder().forEntity(Offer.class).get();
org.apache.lucene.search.Query offerCode_1 = queryBuilder_1.phrase().onField("offerTitle").sentence(queryString).createQuery();
org.hibernate.Query offerCodeHibQuery = fullTextSession.createFullTextQuery(offerCode_1);
List<?> offerCodeResults = offerCodeHibQuery.list();
它仍无效。
答案 0 :(得分:1)
您没有对字段进行标记,因此您需要使用单个未分析的字词进行搜索。我发现,最简单的方法是直接使用Lucene API并构建一个TermQuery
,如:
Query query = new TermQuery(new Term("offerTitle", queryString));
我认为这也应该有效:
queryBuilder_1.keyword().onField("offerTitle").matching(queryString).createQuery();
答案 1 :(得分:1)
queryBuilder_1.phrase().withSlop(0)
.onField("offerTitle").sentence(queryString).createQuery()