停用词,例如[“ a”,“ an”,“ and”,“ are”,“ as”,“ at”,“ be”,“ but”,“ by”,“ for”,“ if”,“在”,“成”,“是”,“它”,“不”,“不”,“的”,“在”,“或”,“这样”,“那个”,“那个”,“他们的” ,“当时”,“那里”,“这些”,“它们”,“此”,“至”,“是”,“将”,“具有”]以及它们在术语或数据库或文件中的存在被lucene索引/搜索可能导致以下任何情况:
- 在Lucene索引过程中停止忽略/过滤单词
- 在Lucene查询过程中停止忽略/过滤单词
- 包含,以任何停用词开头或结尾的查询均无结果
在索引和搜索过程中解决此问题或处理它们的方法如下。 如果您使用的是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替换了它,发现它适用于所有“停止词”和所有“案例”。
我发现以上是解决此问题的最佳/最小方法。 此外,我们的质量检查已验证了它适用于所有“停止词”案例! 希望这对您有所帮助。
翻译自: https://www.javacodegeeks.com/2016/04/handle-stop-words-hibernate-search-5-5-2-apache-lucene-5-4-x.html