ElasticSearch - 过滤热门词

时间:2017-03-28 16:22:34

标签: elasticsearch nest

我有一个我正在索引的文档列表:

        ElasticIndex.CreateIndex(IndexName, _ => _
            .Mappings(__ => __
                .Map<AlbumMetadata>(
                    M => M.AutoMap()
                   .Properties(P => P.Text(T => T.Name(N => N.Keywords)
                       .Analyzer("stop")
                       .Fields(F => F.Keyword(K => K.Name("keywords"))))))));

在我的班级 AlbumMetaData 中,字段关键字是一个列表:

    [Keyword]
    public List<string> Keywords            { get; set; }

当我想检索顶部术语时,我会执行以下查询(您可以忽略 Category Type ,它们与问题无关):< / p>

        var Match = Driver.Search<AlbumMetadata>(_ => _
            .Query(Q => Q
                .Term(P => P.Category, (int)Category) && Q
                .Term(P => P.Type, (int)Type))
            .Source(F => F.Includes(S => S.Fields(L => L.Keywords)))
            .Aggregations(A => A
                .Terms("Tags", T => T
                    .Field(E => E.Keywords)
                    .Size(Limit)
            )
        ));

        var Tags = Match.Aggs.Terms("Tags").Buckets.ToDictionary(K => K.Key, V => V.DocCount);

问题是在输出中,我得到了一些停用词和一些符号,比如/ - &amp; |

我做错了什么?

编辑: 为了澄清这个问题,我正在努力实现这个目标:

我的文件有标题(完整的英文句子)和标签(单个单词列表,有时标签是双字标签)。

我需要能够执行搜索,找到基于标题和标签的文档(理想情况下使用词干,忽略复数等)。 我还需要提取顶部单词列表。关键字列表是标题中所有单词和标签列表中所有条目的串联。

我在这种情况下创建适当的索引的方式是什么?另外,我是以正确的方式进行聚合的方式吗?

1 个答案:

答案 0 :(得分:1)

有一些事情:

  1. 创建索引时,映射上的.AutoMap()将从POCO属性类型和应用于它们的属性推断出Elasticsearch字段数据类型。然后,.Properties()将覆盖任何这些推断的映射。因此,Keywords映射的最终结果是应用了stop分析器的text数据类型字段,multi-field的{​​{1}}子字段(可查询)通过"keywords"),设置为keyword数据类型。
  2. 聚合正在"keywords.keywords" "keywords"字段上运行,并应用了text分析器。 stop分析器uses English stop words by default,但您可以通过在索引中定义自定义stop分析器,为stop分析器配置其他停用词。 stop分析器不会删除stop/-&等符号。
  3. 使用术语聚合,您通常希望在字段的逐字术语上返回聚合,您可以使用聚合中的|字段获取映射。您可以将normalizer应用于类似于分析器的"keywords.keywords"字段,但它只生成一个令牌。这是因为keyword字段使用doc_values,这是一种磁盘上的列式数据结构,适用于性能良好的大规模聚合。

    您也可以在keyword字段上运行聚合,但您还需要启用fielddata并了解其工作原理。 text字段无法使用text