9

elasticsearch 是否提供了一种跟踪热门关键字的方法?例如,在给定的时间段内,我想知道查询中出现频率最高的关键字。

如果elasticsearch没有这样的功能,那么使用elasticsearch实现它的好方法是什么?

谢谢!

4

4 回答 4

12

我认为没有内置的方法,但是通过术语方面应该很容易实现

你需要做的是:

  1. 将所有查询关键字与时间戳一起保存在弹性搜索索引中
  2. 运行按您感兴趣的时间间隔过滤的 match_all 查询,并在其上应用术语方面

不幸的是,我没有时间给你写一个例子,但这应该会引导你找到解决方案。

这是一个例子:

// Demo index
curl -XDELETE 'http://localhost:9200/queries/'
curl -XPUT 'http://localhost:9200/queries/'

// Add some data
curl -XPUT 'http://localhost:9200/queries/query/1' -d '
{ 
    "date": "2013-02-19T12:57:23", 
    "query": "Trying out ElasticSearch, so far so good?"
}'

curl -XPUT 'http://localhost:9200/queries/query/2' -d '
{ 
    "date": "2013-03-02T11:27:23", 
    "query": "Lets give ElasticSearch another try"
}'

curl -XPUT 'http://localhost:9200/queries/query/3' -d '
{ 
    "date": "2013-04-02T08:27:23", 
    "query": "OK, why dont we stick to SOLR?"
}'

curl -XPUT 'http://localhost:9200/queries/query/4' -d '
{ 
    "date": "2013-04-19T11:27:23", 
    "query": "Couse ElasticSearch is so much cooler, its bonsai cool"
}'

// Query it
curl -XGET 'http://localhost:9200/queries/query/_search?pretty=true' -d '
{
    "query" : {
        "filtered" : {
            "filter" : {
                "range" : {
                    "date" : {
                        "gte" : "2013-01-01T00:00:00",
                        "lt" : "2013-04-01T00:00:00"
                    }
                }
            },
            "query" : {
                "match_all" : {}
            }
        }
    },
    "facets": {
        "keywords": {
            "terms": {
                "field": "query"
            }
        }
    }
}
'

调整查询中的日期范围以查看输出的变化

于 2013-04-18T23:10:41.117 回答
3

已批准的答案不再起作用,因为 Facets 已被删除并替换为术语聚合

于 2017-11-27T21:54:01.667 回答
1

ES 没有这个内置的,但是有一个由 Sematext 运行的免费搜索分析服务(免责声明:我在那里工作)你可以使用它 - 见http://sematext.com/search-analytics/index.html

于 2013-04-22T19:21:28.203 回答
0

由于elasticsearch没有这样的内置功能,您可以使用google analyitc等免费服务并将与elasticsearch通信的包装服务集成。

于 2019-07-10T15:16:33.707 回答