在索引模板中,我定义了一个自定义分析器,其中包含停用词过滤器。请参见以下代码段:
"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
-field上的字母组合定义了映射。接下来,通过查看前100个文档计数,尝试获得最常用的单词: "aggs":{
"wordcounts":{
"terms":{
"field" : "textBody",
"size" : 100
}
}
}
不幸的是,在这种方法中,结果中还包含停用词。此停用词的文档数很高,但是词频为零(通过
script field tf()
进行后续查询)。有没有办法从汇总结果中删除停用词?附注:重要术语查询还为我提供了搜索结果中的停用词。
德语停用词的示例:“卑鄙的”,“音乐”,“痛”,“ 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”。
最佳答案
5.0之前的Lucene版本似乎使用硬编码的停用词列表。 (view source code)。这不包括“viel”,“muss”,“soll”,“weg”,“den”。它确实包括“ war ”。
因此,您可以在文件中指定一个stopwords_path
,其中包含您需要的所有停用词(请参阅https://www.elastic.co/guide/en/elasticsearch/guide/current/using-stopwords.html)。
从5.0版开始,停用词总是从文件中读取,但我找不到默认文件的文本。我找到了一些文件,它们比版本4.10.4的硬编码列表更丰富,但是我不知道默认使用哪个文件(here is one)
关于elasticsearch - 聚合结果中没有停用词的Elasticsearch查询,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/32694958/