从 Elasticsearch 中的基本术语聚合中删除停用词?

Removing stopwords from basic Terms aggregation in Elasticsearch?

我对 Elasticsearch 有点陌生,但基本上我有一个名为 posts 的索引,其中包含多个 post 文档,格式如下:

"post": {
    "id": 123,
    "message": "Some message"
}

我正在尝试通过简单的 Terms 聚合获取整个索引中 message 字段中出现频率最高的词:

curl -XPOST 'localhost:9200/posts/_search?pretty' -d '
{
    "aggs": {
        "frequent_words": {
            "terms": {
                "field": "message"
            }
        }
    }
}
'

不幸的是,这个聚合包括停用词,所以我最终得到了一个像 "and"、"the"、"then" 等词的列表,而不是更有意义的词。

我试过应用分析器来排除那些停用词,但无济于事:

curl -XPUT 'localhost:9200/posts/?pretty' -d '
{
    "settings": {
        "analysis": {
            "analyzer": {
                "standard": {
                    "type": "standard",
                    "stopwords": "_english_"
                }
            }
        }
    }
}'

我是在正确地应用分析器,还是在使用错误的方法?谢谢!

我猜你忘了将分析器设置为你的类型字段的消息字段。因为 Elasticsearch 在聚合数据时使用它们的索引数据。这意味着如果您正确分析您的字段,Elasticsearch 不会获取您的停用词。你可以检查这个link。我使用 kibana 的 sense 插件来执行以下请求。检查映射创建请求

PUT /posts
{
    "settings": {
        "analysis": {
            "analyzer": {
                "my_analyzer": {
                    "type": "standard",
                    "stopwords": ["test", "testable"]
                }
            }
        }
    }
}

### Dont forget these lines
POST /posts/post/_mapping
{
  "properties": {
    "message": {
      "type": "string", 
      "analyzer": "my_analyzer"
    }
  }
}

POST posts/post/1
{
  "id": 1,
  "message": "Some messages"
}

POST posts/post/2
{
  "id": 2,
  "message": "Some testable message"
}

POST posts/post/3
{
  "id": 3,
  "message": "Some test message"
}


POST /posts/_search
{
    "aggs": {
        "frequent_words": {
            "terms": {
                "field": "message"
            }
        }
    }
}

这是我针对此搜索请求的结果集:

{
  "hits": {
  ...
  },
  "aggregations": {
    "frequent_words": {
      "doc_count_error_upper_bound": 0,
      "sum_other_doc_count": 0,
      "buckets": [
        {
          "key": "some",
          "doc_count": 3
        },
        {
          "key": "message",
          "doc_count": 2
        },
        {
          "key": "messages",
          "doc_count": 1
        }
      ]
    }
  }
}

在最近的 version 5.5 中,string 类型已更改为 text/keyword。我为字段标题启用了停用词,它正在用于搜索。意味着如果我搜索,它不会返回但如果我在下面使用聚合

"field": "message_analyzed.keyword"

也在聚合桶中获取停用词。

欢迎提出任何建议。

谢谢