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

时间:2016-09-01 04:45:52

标签: elasticsearch stop-words

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

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

我试图在整个索引的message字段中获取最常出现的字词,并使用简单的术语汇总:

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

不幸的是,这个聚合包括停用词,所以我最终会得到一个单词列表,例如"和","","然后"等等更有意义的话语。

我尝试使用分析器来排除这些停用词,但无济于事:

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

我是否正确使用了分析仪,或者我的方法是错误的?谢谢!

2 个答案:

答案 0 :(得分:1)

我猜你忘了将分析器设置为你的类型字段的消息。因为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
        }
      ]
    }
  }
}

答案 1 :(得分:0)

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

"field": "message_analyzed.keyword"

在聚合桶中获取停用词。

欢迎任何建议。

由于