【问题标题】:Hibernate-Search - Case insensitive wildcard search using lucene query parser syntax (not using QueryBuilder!)Hibernate-Search - 使用 lucene 查询解析器语法不区分大小写的通配符搜索(不使用 QueryBuilder!)
【发布时间】:2019-06-25 17:55:57
【问题描述】:

首先,这是我的 Hibernate-Search 索引时间设置:

// ...
@Indexed(index = "XXXRequestIndex")
@AnalyzerDef(name = "toLowercaseAnalyzer",
    tokenizer = @TokenizerDef(factory = KeywordTokenizerFactory.class),
    filters = {
        @TokenFilterDef(factory = LowerCaseFilterFactory.class)
    })
public class XXXRequest implements Serializable {
    // ...
    @Field(analyze = Analyze.YES, store = Store.YES, analyzer = @Analyzer(definition = "toLowercaseAnalyzer"))
    @SortableField
    private String status;
    // ...
}

我看到了这个线程,其中.overridesForField(...) 在查询时在QueryBuilder 上设置了一个字段,以便使用通配符查询不区分大小写: Hibernate Search | ngram analyzer with minGramSize 1

我只需要对特定字段(“状态”)执行类似操作,但我使用QueryBuilder,而是使用@987654327 解析传入的lucene 查询字符串@。我无法将其更改为使用QueryBuilder 构建查询,因为代码调用者使用 lucene 查询解析器语法发出他们自己的动态查询很重要(如在https://lucene.apache.org/core/2_9_4/queryparsersyntax.html 中或多或少地描述)

所以当调用者作为 lucene 查询status:*n\ Pr* 发送时,它与“处理中”不匹配。 但是像status:*n\ pr* 这样的查询确实匹配“处理中”。

我的查询代码:

Analyzer analyzer = new KeywordAnalyzer();
String[] fields = ...
MultiFieldQueryParser queryParser = new MultiFieldQueryParser(
    fields,
    analyser);

Query luceneQuery = queryParser.parse(luceneFilterString);
List results = fullTextQuery.getResultList();

如何使查询不区分大小写?

【问题讨论】:

    标签: java lucene wildcard hibernate-search case-insensitive


    【解决方案1】:

    MultiFieldQueryParser 不会分析通配符搜索,因此您必须自己进行过滤(因此您需要手动将过滤器应用于您的输入字符串)。

    另一种选择是使用简单查询字符串功能(请参阅https://docs.jboss.org/hibernate/stable/search/reference/en-US/html_single/#_simple_query_string_queries),它可以对此类查询应用分析,但它仅支持前缀查询(因此您可以搜索process*,但不能搜索*cessing )。如果你可以接受这个限制,我真的推荐这种方法。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-06-07
      • 1970-01-01
      • 2010-09-12
      • 1970-01-01
      相关资源
      最近更新 更多