ElasticSearch 记录

Elasticsearch实战
本文介绍如何使用Elasticsearch进行数据索引及查询操作,包括通过REST API和Java API实现数据的增删改查,并提供了完整的代码示例。
version: 5.4.1

step 1  下载 elasticsearch

step 2   启动  {es_dir}/bin/.elasticsearch


创建索引、put一条数据

curl -XPUT 'http://localhost:9200/twitter/tweet/1' -d '{
  "user":"lili",
  "post_date":"2017-06-09",
  "message":"Hello, ElasticSearch!"
}'

Rest API 查询

curl -XGET 'http://localhost:9200/twitter/tweet/_search?pretty'
{
  "took" : 0,
  "timed_out" : false,
  "_shards" : {
    "total" : 5,
    "successful" : 5,
    "failed" : 0
  },
  "hits" : {
    "total" : 1,
    "max_score" : 1.0,
    "hits" : [
      {
        "_index" : "twitter",
        "_type" : "tweet",
        "_id" : "1",
        "_score" : 1.0,
        "_source" : {
          "user" : "lili",
          "post_date" : "2017-06-09",
          "message" : "Hello, ElasticSearch!"
        }
      }
    ]
  }
}

Java API 查询

1、POM.xml

<dependency>
            <groupId>org.elasticsearch.client</groupId>
            <artifactId>transport</artifactId>
            <version>5.4.1</version>
        </dependency>

        <dependency>
            <groupId>org.elasticsearch</groupId>
            <artifactId>elasticsearch</artifactId>
            <version>5.4.1</version>
        </dependency>

        <dependency>
            <groupId>org.apache.logging.log4j</groupId>
            <artifactId>log4j-api</artifactId>
            <version>2.8.2</version>
        </dependency>

        <dependency>
            <groupId>org.apache.logging.log4j</groupId>
            <artifactId>log4j-core</artifactId>
            <version>2.8.2</version>
        </dependency>


2、src/main/resources 下新建 log4j2.properties文件

appender.console.type = Console
appender.console.name = console
appender.console.layout.type = PatternLayout

rootLogger.level = info
rootLogger.appenderRef.console.ref = console

3、测试(jdk版本>=1.8)

public class ESDemo {
    public static void main(String[] args) throws Exception {
        Settings settings = Settings.builder()
                .put("cluster.name", "myes")//集群名称可以在{es_dir}/conf/elasticsearch.yml中配置
                .put("client.transport.sniff", "true").build();

        TransportClient client = new PreBuiltTransportClient(settings).addTransportAddress(new InetSocketTransportAddress(InetAddress.getByName("localhost"), 9300));

        QueryBuilder qb = termQuery("user", "lili");

        SearchResponse response = client.prepareSearch("twitter")
                .setTypes("tweet").setQuery(qb).get();

        if (response.getHits().getTotalHits() != 0) {
            SearchHits shs = response.getHits();
            for (SearchHit sh : shs.getHits()) {
                System.out.println((sh.getSource().get("message")));
            }
        }
    }
}


4、结果




Elasticsearch 中,可以通过脚本字段和聚合来根据搜索记录的搜索次数和搜索时间计算热度值。以下是具体的实现步骤和示例代码: ### 数据准备 假设搜索记录的文档结构如下: ```json { "search_term": "example term", "search_count": 10, "search_time": "2024-01-01T12:00:00Z" } ``` ### 计算热度值的方法 可以使用 Elasticsearch 的脚本字段和聚合来计算热度值。热度值的计算可以考虑搜索次数和搜索时间的权重,例如,近期的搜索记录给予更高的权重。 #### 示例代码 ```python from elasticsearch import Elasticsearch # 连接到 Elasticsearch es = Elasticsearch([{'host': 'localhost', 'port': 9200}]) # 定义查询和聚合 query = { "size": 0, "aggs": { "hot_search_terms": { "terms": { "field": "search_term.keyword" }, "aggs": { "total_search_count": { "sum": { "field": "search_count" } }, "latest_search_time": { "max": { "field": "search_time" } }, "heat_score": { "bucket_script": { "buckets_path": { "count": "total_search_count", "time": "latest_search_time" }, "script": "params.count * Math.exp(-(params.now - params.time) / (1000 * 60 * 60 * 24))", "params": { "now": int(es.info()['process']['start_time_in_millis']) } } } } } } } # 执行查询 response = es.search(index="search_records", body=query) # 输出结果 for bucket in response['aggregations']['hot_search_terms']['buckets']: print(f"Search Term: {bucket['key']}, Heat Score: {bucket['heat_score']['value']}") ``` ### 代码解释 1. **连接到 Elasticsearch**:使用 `Elasticsearch` 类连接到 Elasticsearch 集群。 2. **定义查询和聚合**: - `terms` 聚合按搜索词分组。 - `sum` 聚合计算每个搜索词的总搜索次数。 - `max` 聚合获取每个搜索词的最新搜索时间。 - `bucket_script` 聚合根据搜索次数和搜索时间计算热度值。 3. **执行查询**:使用 `search` 方法执行查询,并获取结果。 4. **输出结果**:遍历聚合结果,输出每个搜索词的热度值。 ### 注意事项 - 热度值的计算方法可以根据实际需求进行调整,例如,可以调整时间衰减的系数。 - 确保 Elasticsearch 集群的时间和脚本中的时间戳一致。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值