【问题标题】:lucene - search with contains valuelucene - 搜索包含值
【发布时间】:2022-02-02 15:21:04
【问题描述】:

我的数据库中有一个字段 socialReason,其中包含以下值

  • ch fleyriat
  • CLINIQUE DENTAIRE MUTUALISTE
  • BETSCHDORF 调查中心

例如,我想当我搜索单词 CH 时,我得到包含 CH 的值,在我的 CAS 中,我想得到 ch fleyriat 和 CENTER DE SOINS INFIRMIERS BETSCHDORF

我尝试了以下代码,但它什么也没返回

  @Field(analyzer = @Analyzer(definition = "test"))
  private String socialReason;

  public class CustomAnalyzerProvider implements LuceneAnalysisDefinitionProvider {
    @Override
    public void register(LuceneAnalysisDefinitionRegistryBuilder builder) {
        builder
        .analyzer( "test" )
                .tokenizer( KeywordTokenizerFactory.class )
                .tokenFilter( ASCIIFoldingFilterFactory.class )
                .tokenFilter( LowerCaseFilterFactory.class );
    }
  } 

  fullTextEntityManager.getSearchFactory().buildQueryBuilder().forEntity(ExerciseFrameworkEntity.class)
 .overridesForField("socialReason", "test").get();

  listOfQuery.add(getQueryBuilder().keyword().onField("socialReason").matching(socialReason).createQuery());

【问题讨论】:

    标签: hibernate jpa lucene hibernate-search


    【解决方案1】:

    您正在使用ngram 标记过滤器,该过滤器将生成索引中每个单词的所有子字符串的列表。

    您可以想象,这会生成大量数据,因此您的索引会非常大。仅对相当小的数据集执行此操作。

    请参阅this question 中提到的分析器配置,另请参阅该问题的答案以正确查询此字段。

    如果可以,我还建议重新考虑您的要求:通常将 开始 的单词与用户键入的内容(在您的示例中,以“ch”开头的单词)匹配就足够了,并且多亏了 edgeNgram tokenFilter,这可以用低得多的开销来实现。为此,请参阅this other answer

    【讨论】:

    • 抱歉,我的问题打错字了,我将overridesForField("socialReason", "edgeNgram") 替换为verridesForField("socialReason", "test")。我不想要以“ch”开头的单词,我想要包含“ch”的单词。据我了解EdgeNGramFilterFactory, minGramSize="1", maxGramSize="10" 分析器将单词“ch fleyriat”转换为“c”、“ch”、“f”、“fl”、“fle”、“fley”、“fleyr”、“fleyri”, fleyria","fleyriat" 和单词 "BETSCHDORF" 到 "B","BE","BET","BETS","BETSC","BETSCH"...,在这种情况下,当用户键入 "CH ",它只返回 "ch fleyriat"。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-12-13
    相关资源
    最近更新 更多