当前位置: 首页 > 知识库问答 >
问题:

如何在Hibernate搜索中搜索特殊字符?

艾泉
2023-03-14

我刚开始使用hibernate lucene搜索。从几天以来,我一直致力于搜索关键字与特殊字符。我正在使用MultiFieldQueryParser进行精确短语匹配以及布尔搜索。但在这个过程中,我无法得到搜索关键字的结果,如“有1年以上的经验”,如果我没有在搜索关键字周围添加任何引号,那么我就得到了结果。所以我在执行lucene查询时观察到的是,它正在转义特殊符号(+)。我正在使用StandardAnalyzer.Class。我认为,如果我使用WhiteSpaceAnalyzer它不会转义特殊字符,但它可能会影响布尔搜索,如+java+php(即java和php),因为它可能会处理正常的文本。所以请协助一些建议。

以下是我的片段:

Session session = getSession();
        FullTextSession fullTextSession = Search.getFullTextSession(session);

        MultiFieldQueryParser parser = new MultiFieldQueryParser(new String[] { "student.skills.skill",
                "studentProfileSummary.profileTitle", "studentProfileSummary.currentDesignation" },
                new StandardAnalyzer());
        parser.setDefaultOperator(Operator.OR);
        org.apache.lucene.search.Query luceneQuery = null;
        QueryBuilder qb = fullTextSession.getSearchFactory().buildQueryBuilder().forEntity(Student.class).get();
        BooleanQuery boolQuery = new BooleanQuery();
        if (StringUtils.isEmpty(zipcode) != true && StringUtils.isBlank(zipcode) != true) {
            boolQuery.add(
                    qb.keyword().onField("personal.locations.postalCode").matching(zipcode).createQuery(),
                    BooleanClause.Occur.MUST);
        }
        if (StringUtils.isEmpty(query) != true && StringUtils.isBlank(query) != true) {
            try {
                luceneQuery = parser.parse(query.toUpperCase());
            } catch (ParseException e) {
                luceneQuery = parser.parse(parser.escape(query.toUpperCase()));
            }
            boolQuery.add(luceneQuery, BooleanClause.Occur.MUST);
        }
        boolQuery.add(qb.keyword().onField("vStatus").matching(1).createQuery(), BooleanClause.Occur.MUST);
        boolQuery.add(qb.keyword().onField("status").matching(1).createQuery(), BooleanClause.Occur.MUST);
        boolQuery.add(qb.range().onField("studentProfileSummary.profilePercentage").from(80).to(100).createQuery(),
                BooleanClause.Occur.MUST);
        FullTextQuery createFullTextQuery = fullTextSession.createFullTextQuery(boolQuery, Student.class);
        createFullTextQuery.setProjection("id", "studentProfileSummary.profileTitle", "firstName","lastName");

        if (isEmptyFilter == false) {
            createFullTextQuery.setFirstResult((int) pageNumber);
            createFullTextQuery.setMaxResults((int) end);
        }
        return createFullTextQuery.list();

共有1个答案

阎宾实
2023-03-14

控制这种效果的关键确实在于你选择使用的分析器。正如您所注意到的,标准分析器将移除/忽略一些符号,因为它们通常不被使用。

由于标准分析器适用于大多数英语自然语言,但您也希望处理特殊符号,因此典型的解决方案是将文本索引到多个字段中,并为每个字段分配不同的analyzer。然后,您可以生成针对这两个字段的查询,并组合从这两个字段获得的分数。您甚至可以自定义每个字段应该具有的权重,并尝试不同的similary实现以获得各种效果。

但是在你的“1+Years”的具体例子中,你可能需要考虑你期望它会发现什么。是否应该匹配一串“6年”?那么您可能希望实现一个自定义分析器,它专门查找此类模式,并生成多个匹配的令牌,如序列{“1年”,“2年”,“3年”,...}。这将是有效的,但只匹配特定的术语序列,所以也许您想从Lucene社区中寻找更高级的扩展,因为您可以在其中插入更多的扩展。

 类似资料:
  • 是否可以通过fullTextQuery找到带有特殊字符的单词?luke的搜索很好地处理了查询,但是from fullTextQuery没有返回任何结果。 不带通配符搜索“C”,不带特殊字符。 如何解决这个问题?

  • 我有一个问题与搜索的特殊字符在solr。我的文档有一个字段标题,有时它可以像泰坦尼克号-1999(它有字符-)。当我试图搜索索尔与"-"我收到一个400错误。我试图逃避这个角色,所以我尝试了像“-”和“\-”这样的东西。有了这些变化,solr不会用错误来回应我,但它会返回0个结果。 如何在solr admin中搜索具有该特殊字符(如“-”或“”?)的内容??? 问候 在这里更新您可以看到我当前的s

  • 问题内容: 我无法在Elasticsearch中以特殊字符结尾/开头的字符进行搜索。就像“ 123456!” 我的映射是 它给我错误,我可以在搜索查询(或映射)中做什么,以便特殊字符将被视为搜索字符串的一部分? 问题答案: 由于您的字段是(好!),请尝试用双引号引起来进行完全匹配: 这样做的另一种方法是在查询中设置分析器(但请务必转义,因为它是保留字符(对于操作员)

  • 使用Umbraco v6,检查搜索(不是完整的Lucene查询)。这是一个拉丁/南美洲网站。我问过我的同事,他们如何在搜索/URL中键入标题(字母上的重音符号),他们都说他们没有,他们只使用“常规”字符(a-Z,a-Z)。 我知道在传递到Examine时如何从字符串中去掉特殊字符,但我需要另一种方法,如Examine从属性中删除特殊字符以匹配查询。我有许多“节点”的名称中有标题(这是我正在搜索的属

  • 问题内容: 我正在支持一个Java应用程序,该应用程序具有一个与关键字匹配的搜索栏,并从缓存中获取结果。 该应用程序在Tomcat中运行,并且也具有Apache Web服务器。 搜索 aaa时 出现问题, “ 特殊字符 ” 导致了问题,我进入 禁止您无权访问/xx/xx/xxxx.jsp 由于没有Web服务器,因此可以在本地设置中进行搜索。如我所见,一些帖子暗示该问题可能是由Web服务器配置引起的

  • 当我搜索“#”等特殊字符时,没有结果出现。 请注意,我已经转义了查询字符串。 然而,当与“c#”这样的字母组合时,Lucene找到了这个词。 有没有办法搜索单个特殊字符? 这是我的片段: