Elasticsearch查询在聚合结果中没有停用词

时间:2015-09-21 12:13:45

标签: elasticsearch

在我的索引模板中,我定义了一个自定义分析器,其中包含一个停用词过滤器。请参阅以下代码段:

  "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,它构建于:

之上
  • elasticsearch:1.7.0
  • lucene的核:4.10.4

更新

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

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

1 个答案:

答案 0 :(得分:0)

5.0之前的Lucene版本似乎使用了硬编码的停用词列表。 (view source code)。这不包括" viel"," muss"," soll"," weg"," den"。它包括" war"。

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

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