我有一个搜索框,它基于给定的输入对标题字段进行搜索,因此用户建议所有可用的标题(从插入的文本开始),它基于Lucene和Hibernate Search。在输入空格之前,它工作正常。然后结果消失了。例如,我希望“ Learning H”能够给我“ Learning Hibernate”作为结果。但是,这不会发生。您能否建议我在这里改用什么?
查询生成器:
QueryBuilder qBuilder = fullTextSession.getSearchFactory() .buildQueryBuilder().forEntity(LearningGoal.class).get(); Query query = qBuilder.keyword().wildcard().onField("title") .matching(searchString + "*").createQuery(); BooleanQuery bQuery = new BooleanQuery(); bQuery.add(query, BooleanClause.Occur.MUST); for (LearningGoal exGoal : existingGoals) { Term omittedTerm = new Term("id", String.valueOf(exGoal.getId())); bQuery.add(new TermQuery(omittedTerm), BooleanClause.Occur.MUST_NOT); } @SuppressWarnings("unused") org.hibernate.Query hibQuery = fullTextSession.createFullTextQuery( query, LearningGoal.class);
hibernate类 :
@AnalyzerDef(name = "searchtokenanalyzer",tokenizer = @TokenizerDef(factory = StandardTokenizerFactory.class), filters = { @TokenFilterDef(factory = StandardFilterFactory.class), @TokenFilterDef(factory = LowerCaseFilterFactory.class), @TokenFilterDef(factory = StopFilterFactory.class,params = { @Parameter(name = "ignoreCase", value = "true") }) }) @Analyzer(definition = "searchtokenanalyzer") public class LearningGoal extends Node {
我找到了解决此问题的方法。这个想法是标记输入字符串并删除停用词。对于最后一个标记,我使用关键字通配符创建了查询,对于所有之前的单词,我创建了TermQuery。这是完整的代码
BooleanQuery bQuery = new BooleanQuery(); Session session = persistence.currentManager(); FullTextSession fullTextSession = Search.getFullTextSession(session); Analyzer analyzer = fullTextSession.getSearchFactory().getAnalyzer("searchtokenanalyzer"); QueryParser parser = new QueryParser(Version.LUCENE_35, "title", analyzer); String[] tokenized=null; try { Query query= parser.parse(searchString); String cleanedText=query.toString("title"); tokenized = cleanedText.split("\\s"); } catch (ParseException e) { // TODO Auto-generated catch block e.printStackTrace(); } QueryBuilder qBuilder = fullTextSession.getSearchFactory() .buildQueryBuilder().forEntity(LearningGoal.class).get(); for(int i=0;i<tokenized.length;i++){ if(i==(tokenized.length-1)){ Query query = qBuilder.keyword().wildcard().onField("title") .matching(tokenized[i] + "*").createQuery(); bQuery.add(query, BooleanClause.Occur.MUST); }else{ Term exactTerm = new Term("title", tokenized[i]); bQuery.add(new TermQuery(exactTerm), BooleanClause.Occur.MUST); } } for (LearningGoal exGoal : existingGoals) { Term omittedTerm = new Term("id", String.valueOf(exGoal.getId())); bQuery.add(new TermQuery(omittedTerm), BooleanClause.Occur.MUST_NOT); } org.hibernate.Query hibQuery = fullTextSession.createFullTextQuery( bQuery, LearningGoal.class);