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

  "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,它建立在:
  • elasticsearch: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”。

    最佳答案

    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/

    10-12 17:21