java - 如何在 Hibernate Search 中使用通配符和空格搜索字段

标签 java hibernate lucene full-text-search hibernate-search

我有一个搜索框,它根据给定的输入在标题字段上执行搜索,因此用户推荐了所有以插入的文本开头的可用标题。它基于 Lucene 和 Hibernate 搜索。在输入空格之前它工作正常。然后结果消失了。例如,我希望“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);

关于java - 如何在 Hibernate Search 中使用通配符和空格搜索字段,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15285117/

相关文章:

hibernate - 在 JPA 条件中具有复合主键的 IN 子句

elasticsearch - ElasticSearch:是否可以通过在ElasticSearch中简单地提供查询来搜索文档中的所有文件

c# - 在 ASP.NET MVC 站点中使用 Lucene.Net 时出现目录锁定错误

java - 修复本地主机上的 apache v9.0 服务器 Tomcat v9.0 服务器无法启动错误

java - EHCache 如何检查缓存中是否有内容?

java - Hadoop MapReduce使用相同的键添加值-Java

java - 用于单向 OneToMany 的 JPQL

java - 是否可以在 Windows 上不安装 Python 的情况下安装 Robot Framework?

java - MySql Json对象反序列化优化

java - 同时进行 Lucene 索引和搜索