当前位置: 首页 > 面试题库 >

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

谭锐藻
2023-03-14
问题内容

我有一个搜索框,它基于给定的输入对标题字段进行搜索,因此用户建议所有可用的标题(从插入的文本开始),它基于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);


 类似资料:
  • 问题内容: 我尝试搜索以a或b或c开头的名称,因此我使用了以下查询: 它没有给出空结果或失败结果,只是给出了空值,这意味着什么也没找到。有人可以指导我使用这种方法吗? 问题答案: 您无法使用做这种事情。您需要像这样使用: 该手段别的,所以这将匹配任何名字以A,B或C开头,有别的跟随它。

  • 问题内容: 我已经使用此批量请求设法用4个文档填充了索引: 开机自检 现在如何在所有可用 标题* 上使用 通配符 进行 搜索 ? *** 类似于 但提供一个或多个通配符的东西。例如,搜索“ ”并解析来自elasticsearch的响应以最终返回如下内容: 谢谢! 问题答案: Elasticsearch在常规匹配查询中提供正则表达式支持 给你这个 要更新到您的问题URI搜索,我不确定是否可行,如果使

  • 在Lucene.NET 3.0.3.0的通配符搜索中,我已经寻找了很长时间来转义特殊字符,如#,{,,[,],...,但我找不到任何可能的解决方案。 我使用StandardAnalyzer索引了我文档。字段“title”有属性field.store.yes和field.index.analysis。 搜索时,我为我的SearchTerm调用了MultiFieldQueryParser.Escape

  • 尝试使用通配符进入和弹性搜索精确短语搜索时遇到问题query_string。 希望能够返回结果,这将是所有变体的精确短语。i、 e.“库尔斯酿酒厂”、“库尔斯酿酒厂”、“库尔斯酿酒厂”等。 我不同意这种方法,但想搜索大部分文档以找到匹配的1或2个字段。

  • 问题内容: 可以说我有一个清单 如何让用户进行通配符搜索? 搜索词:“ th_s” 将返回“ this” 问题答案: 正则表达式可能是解决此问题的最简单方法:

  • 问题内容: 我想获取带有通配符的搜索模式的文件名列表。喜欢: 我怎样才能做到这一点? 问题答案: 您可以这样做: 注意 :如果目录中包含以开头的文件,则默认情况下将不匹配它们。例如,考虑包含和的目录: 这直接来自这里:http : //docs.python.org/library/glob.html