在我的索引模板中,我定义了一个自定义分析器,其中包含一个停用词过滤器。请参阅以下代码段:
"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,它构建于:
之上更新
我发现,有一些单词形式被简化为上面提到的单词。例如,“muss”在下面的单词形式的文本中:“muss”,“muesse”,“muessen”,“muß”,“muße”,“müsse”和“müsser”。这些词语都被简化为词干“muss”。如果我查询单词“muss”,那么我得到零结果,因为它被停用词过滤器过滤。
在某些查询中(例如must_not过滤器),甚至可以查询“muss”,结果我得到所有其他单词形式的聚合计数,然后是“muss”。
答案 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)