【问题标题】:Elasticsearch query without stop words in aggregation result聚合结果中没有停用词的 Elasticsearch 查询
【发布时间】:2015-09-21 12:13:45
【问题描述】:

在我的索引模板中,我定义了一个自定义分析器,其中包含一个停用词过滤器。见以下sn-p:

  "settings": {
     "index.analysis.filter.german_stemmer.type": "stemmer",
     "index.analysis.filter.german_stop.type": "stop",
     "index.analysis.filter.german_stemmer.language": "light_german",
     "index.analysis.filter.german_keywords.keywords.0": "",
     "index.analysis.filter.german_stop.stopwords": "_german_",
     "index.analysis.filter.german_keywords.type": "keyword_marker",
     "index.analysis.analyzer.unigram.filter.0": "lowercase",
     "index.analysis.analyzer.unigram.filter.1": "german_stop",
     "index.analysis.analyzer.unigram.filter.2": "german_keywords",
     "index.analysis.analyzer.unigram.filter.3": "german_normalization",
     "index.analysis.analyzer.unigram.filter.4": "german_stemmer",
     "index.analysis.analyzer.unigram.tokenizer": "standard",
  }

我还在textBody 字段上定义了unigram 的映射。接下来,我尝试通过查看前 100 个文档计数来获取最常用的单词:

  "aggs":{
    "wordcounts":{
      "terms":{
        "field" : "textBody",
        "size" : 100
      }
    }
  }

不幸的是,在这种方法中,结果中还包含停用词。这个停用词的文档数很高,但词频为零(通过script field tf() 跟进查询)。有没有办法从我的聚合结果中删除停用词?

P.S.:重要术语查询还会在我的结果集中提供停用词。

德语停用词的示例:“viel”、“muss”、“soll”、“war”、“weg”、“den”、...

我正在使用 elasticsearch-groovy:1.7.0,它建立在:

  • 弹性搜索:1.7.0
  • lucene-core:4.10.4

更新:

我发现,有一些词形被简化为上面提到的词。例如,“muss”在文本中的词形如下:“muss”、“muesse”、“muessen”、“muß”、“muße”、“müsse”和“müsser”。这些词都被简化为词干“muss”。如果我查询“muss”这个词,那么我得到的结果为零,因为它被停用词过滤器过滤了。

在某些查询(例如 must_not 过滤器)中,甚至可以查询“muss”,结果我得到所有其他单词形式的聚合计数,然后是“muss”。

【问题讨论】:

  • 您运行的是哪个 elasticsearch 和 lucene 版本?我怀疑旧的 lucene 版本没有包含你所有的停用词
  • elasticsearch 1.7.0,lucene 4.10.4

标签: elasticsearch


【解决方案1】:

Lucene 5.0 之前的版本似乎使用硬编码的停用词列表。 (view source code)。这不包括“viel”、“muss”、“soll”、“weg”、“den”。它确实包括“战争”。

不过,您可以将stopwords_path 指定到包含您需要的所有停用词的文件(请参阅https://www.elastic.co/guide/en/elasticsearch/guide/current/using-stopwords.html)。

从 5.0 版开始,停用词总是从文件中读取,但我找不到默认文件的文本。我发现了一些文件,它们比 4.10.4 版本的硬编码列表更丰富,但我不知道默认使用哪个文件 (here is one)

【讨论】:

  • 如果我将stopwords_path 与您的文件一起应用,我的聚合查询中是否会得到 100 个没有停用词的结果?
  • @boraas 该文件不是我的;不要在生产中做任何事情,在开发环境中尝试
猜你喜欢
  • 2014-10-22
  • 2018-12-11
  • 1970-01-01
  • 1970-01-01
  • 2021-07-04
  • 2016-08-14
  • 2022-11-29
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多