如何在Hibernate Search 5.5.2 / Apache Lucene 5.4.x中处理停用词?

停用词,例如[“ a”,“ an”,“ and”,“ are”,“ as”,“ at”,“ be”,“ but”,“ by”,“ for”,“ if”,“在”,“成”,“是”,“它”,“不”,“不”,“的”,“在”,“或”,“这样”,“那个”,“那个”,“他们的” ,“当时”,“那里”,“这些”,“它们”,“此”,“至”,“是”,“将”,“具有”]以及它们在术语或数据库或文件中的存在被lucene索引/搜索可能导致以下任何情况:

  1. 在Lucene索引过程中停止忽略/过滤单词
  2. 在Lucene查询过程中停止忽略/过滤单词
  3. 包含,以任何停用词开头或结尾的查询均无结果

在索引和搜索过程中解决此问题或处理它们的方法如下。 如果您使用的是Hibernate Search 5.5.2,而后者又使用的是Apache Lucene 5.3.x / 5.4.x,则此处说明的方法特别适用。

1.定义自定义分析器,改编自标准分析器

您只需包含两个过滤器-“ LowerCaseFilterFactory”和“ StandardFilterFactory”作为Tokenizer定义的一部分。 我们此处未包括的过滤器工厂是“ StopFilter”。 这样可以将停用词视为其他普通英语词,并将它们编入索引。

@Entity 
@Indexed 
@Table(name="table_name", catalog="catalog_name") 
@AnalyzerDef(name = "FedexTextAnalyzer",
   tokenizer = @TokenizerDef(factory = StandardTokenizerFactory.class), 
   filters = {
     @TokenFilterDef(factory = LowerCaseFilterFactory.class),
     @TokenFilterDef(factory = StandardFilterFactory.class) 
})

2.用相关注释标记字段(@Field上的@Analyzer)

连同每个实体或表的列字段上的@Field批注一起,声明我们上面定义的分析器。

@Column(name="Fedex_cs_product_name", nullable=false, length=100)
@Field(index=Index.YES, analyze=Analyze.YES, store=Store.NO, analyzer=@Analyzer(definition = "FedexTextAnalyzer"))
public String getFedexCsItemName() {
   return this.FedexCsItemName;
}

3.使用WhitespaceAnalyzer进行查询,以便默认情况下对停用词进行“处理”

尽管官方文档说如果我们通过将Stop Words的参数作为CharArraySet传入来使用“ StandardAnalyzer” EMPTY_SET我发现查询仍然无法检索任何结果。 在与卢克一起进行分析时,我发现对于诸如“面向初学者的计算机科学书籍”之类的查询,“ for”被忽略了。 奇怪! 我用WhitespaceAnalyzer替换了它,发现它适用于所有“停止词”和所有“案例”。

stop_words_01

我发现以上是解决此问题的最佳/最小方法。 此外,我们的质量检查已验证了它适用于所有“停止词”案例! 希望这对您有所帮助。

翻译自: https://www.javacodegeeks.com/2016/04/handle-stop-words-hibernate-search-5-5-2-apache-lucene-5-4-x.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值