如何在Hibernate Search中搜索带通配符和空格的字段
我有一个搜索框,根据给定的输入在标题字段上执行搜索,因此用户建议所有可用的标题以插入的文本开头。它基于Lucene和Hibernate Search。 它一直工作,直到输入空间。 然后结果消失了。 例如,我希望“学习H”给我“学习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
SQL使用与任何终端不同的通配符。 在SQL '%'
替换零个或多个出现的任何字符(在终端中使用'*'
代替),下划线'_'
恰好替换一个字符(在终端中使用'?'
代替)。 Hibernate不会翻译通配符。
所以在第二行你必须用matching(searchString + "*")
替换matching(searchString + "*")
matching(searchString + "%")
- NamedEntityGraph – JPA / Hibernate抛出org.hibernate.loader.MultipleBagFetchException:无法同时获取多个包
- 如何使用hibernate在spring boot中实现分页
- 使用MYSQL中的hibernate注释设置默认值
- Hibernate(JPA)映射HashMap
- MySQL / Hibernate – 如何调试不断丢弃的MySQL池连接?
- Hibernate持久的Dates
- 使用Hibernate / Spring / JUnit设置和删除复杂数据库状态
- 在哪里可以找到所有Hibernate事件的完整(!)列表?
- Java:Hibernate没有看到DataBase的变化