NGramFilterFactory无法正常工作

时间:2017-06-09 17:18:33

标签: lucene full-text-search hibernate-search analyzer

我想从文本中提取关键字

例如,如果nameEn =“Hello Everybody TODAY”并且我搜索关键字“body”,它会显示结果

我使用了注释AnalyzerDef,但我的代码中存在问题

我将解释这个问题:

nameEn =“今天大家好”

例如,当我搜索“b”时,它会显示结果

但是当我搜索“bo”或“bod”或“body”时,它没有显示任何内容

现在我将minGramSize更改为2

当我搜索“bo”时,它会显示结果

其他关键词“b”,“bod”,“body”它没有显示任何内容

我不知道问题究竟在哪里,因为根据下面的代码,当我输入“bo”时

输出将是:“b”,“bo”

    @Indexed
    @AnalyzerDef(name = "autocompleteNGramAnalyzer", tokenizer = 
      @TokenizerDef(factory = StandardTokenizerFactory.class), filters = {
      @TokenFilterDef(factory = WordDelimiterFilterFactory.class),
      @TokenFilterDef(factory = LowerCaseFilterFactory.class),
      @TokenFilterDef(factory = NGramFilterFactory.class, params = { 
        @Parameter(name = "minGramSize", value = "1"),
        @Parameter(name = "maxGramSize", value = "50") }),
      @TokenFilterDef(factory = PatternReplaceFilterFactory.class, params = {
        @Parameter(name = "pattern", value = "([^a-zA-Z0-9\\.])"),
        @Parameter(name = "replacement", value = " "), @Parameter(name = "replace", value = "all") }) })
    @Analyzer(definition = "autocompleteNGramAnalyzer")
    public class Product implements Serializable {

    @Field(index = Index.YES, analyze = Analyze.YES, store = Store.NO)
    private String nameEn;

搜索方法:

    public List<Product> searchProduct(String keyWord) {
    FullTextSession fullTextSession = Search.getFullTextSession(getSession());
    try {
        fullTextSession.createIndexer().startAndWait();
    } catch (InterruptedException e) {
        e.printStackTrace();
    }
    QueryBuilder queryBuilder = fullTextSession.getSearchFactory().buildQueryBuilder().forEntity(Product.class).get();
    org.apache.lucene.search.Query luceneQuery = queryBuilder.phrase().withSlop(2).onField("nameEn").boostedTo(5).sentence(keyWord.toLowerCase()).createQuery();
    org.hibernate.Query fullTextQuery = fullTextSession.createFullTextQuery(luceneQuery, Product.class);
    List<Product> result = fullTextQuery.list();
    return result;
}

任何帮助表示赞赏

1 个答案:

答案 0 :(得分:0)

您可以尝试使用关键字查询而不是词组查询:queryBuilder.keyword().onField("nameEn").boostedTo(5).matching(keyWord.toLowerCase()).createQuery();

如果您的分析师的名字显示您正在进行自动填充,则短语查询可能不相关。无论如何,这将是实现工作的第一步。

另外,您可能希望在分析查询时阻止生成n-gram(特别是如果您需要短语查询)。有关详细信息,请参阅&#34; 编辑&#34;在这个答案的一部分:Hibernate search to find partial matches of a phrase