从 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"
也在聚合桶中获取停用词。
欢迎提出任何建议。
谢谢
我对 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"
也在聚合桶中获取停用词。
欢迎提出任何建议。
谢谢