精华内容
下载资源
问答
  • 2021-03-23 16:18:06

    Elasticsearch6.8
    HighLevel方式
    场景:全局搜索,综合搜索,可能有帖子,产品,文章等,要倒序,哪个发布了就在最上面显示出来

    问题

    在多索引全局查询时,比如设置了sourceBuilder.sort(“字段名”, SortOrder.DESC);会报错如下
    Elasticsearch exception [type=class_cast_exception, reason=java.lang.Long cannot be cast to org.apache.lucene.util.BytesRef

    Elasticsearch exception [type=class_cast_exception, reason=java.lang.Long cannot be cast to org.apache.lucene.util.BytesRef

    试了好几种解决方案没有办法打到自己想要的效果,后续研究下有没有好的解决方案和高版本是否支持

    我的方案:

    因为加入的顺序是顺序的,比如id为1,2,3,4,5……也有createTime字段
    所以先查询符合条件的条数

    restHighLevelClient.count(countRequest, RequestOptions.DEFAULT);

    然后根据条数计算你要取的起始位置

    sourceBuilder.from(count > 10 ? count - esSearchDTO.getFrom() * esSearchDTO.getSize() : 0);
    sourceBuilder.size(esSearchDTO.getSize());

    比如pageNum=1,pageSize=10,一共100条数据,你要取最后10条,则用100 - 110=90,从第90位置取10条到100
    第二页为100-2
    10=80,从第80取10到90

    取出数据后有不同类型的对象怎么办?如何排序?
    可以在各个索引中定义createTime
    在最后得到的结果中使用Collections.sort取共同字段createTime进行比较排序

    以上方式虽然不是很好,但是先解决这个问题了,谁还有好方案可以留言,感谢

    更多相关内容
  • Elasticsearch 可以用于:分布式实时文件存储,并将每一个字段都编入索引,使其可以被搜索;实时分析的分布式搜索引擎;可以扩展到上百台服务器,处理PB级别的结构化或非结构化数据。 Elasticsearch的文件存储   ...
  • spring data elasticsearch多索引查询

    千次阅读 2018-10-06 11:50:00
    一次查询多索引数据 es里可以这样写 GET 索引1,索引2,索引3/_search 也可以这样 给索引创建别名,索引可以使用一个别名 POST /_aliases { "actions": [ { "add": { "index": "myindex2", ...

    一次查询多个索引数据

    es里可以这样写

    GET 索引1,索引2,索引3/_search

    也可以这样

    给索引创建别名,多个索引可以使用一个别名

    POST /_aliases
    {
      "actions": [
        {
          "add": {
            "index": "myindex2",
            "alias": "myalias"
          }
        },{
          "add": {
            "index": "myindex3",
            "alias": "myalias"
          }
        }
      ]
    }

    或者

    PUT /myindex2/_alias/myalias 

    删除别名

    POST /_aliases
    {    
      "actions": [        
        { 
          "remove": { 
            "index": "myindex3", 
            "alias": "my_index_alias" 
          }
        }    
      ]
    }

     

    java查询多个索引

    SearchQuery searchQuery = new NativeSearchQueryBuilder()
                    .withIndices("myindex2","myindex4")  //可以直接使用别名
                    .withQuery(queryBuilder)
                    //.addAggregation(sumBuilder)
                    .build();
            List<Map> map=elasticsearchTemplate.query(searchQuery, response -> {
                SearchHits hits = response.getHits();
                List<Map> list=new ArrayList<>();
                Arrays.stream(hits.getHits()).forEach(h -> {
                    Map<String, Object> source = h.getSource();
                    System.out.println(JSONArray.toJSONString(source));
                    list.add(source);
                });
                return list;
            });

     

    转载于:https://www.cnblogs.com/double-yuan/p/9740494.html

    展开全文
  • java 操作es多索引查询的时候,可不可以首先指定一个索引查询条件,然后在进行多索引查询
  • elasticsearch通过顶部多索引,实现联合查询

    万次阅读 热门讨论 2019-05-06 15:15:38
    一、前言       之前试了下多索引查询,就是索引以...elasticsearch多索引联合查询以及范围日期查询示例 背景:使用es-php + es7.0 二、正文 1、首先索引部分还是以数组的形式 '...

    一、前言

          之前试了下多索引查询,就是索引以数组的方式进行查询,发现这种方式是可以的。但是如果两个索引的名字,字段都不相同,可以实现类似于mysql的那种join效果吗,试试吧

    elasticsearch的多索引联合查询以及范围日期查询示例

    背景:使用es-php + es7.0

    二、正文

    1、首先索引部分还是以数组的形式

     'index' => ['zeusa.evony.com.accesslog-2019.03.28','zeusa.evony.com.accesslog-2019.03.29','users'],
    

    2、进行普通查询

    这一步发现了问题,就是如果要根据条件查询的话,那么多个索引之间必须有相同的条件字段才行,总结就是:
    (1)、写法就是用数组的方式
    (2)、注意type必须保持一致,不然会查不到
    (3)、如果有条件,那么条件字段要保证每个索引中都有
    (4)、查询出来的代码如下:

       [89]=>
          array(5) {
            ["_index"]=>
            string(5) "user1"
            ["_type"]=>
            string(3) "doc"
            ["_id"]=>
            string(20) "6CgEWGoBSw5ta76v3QnC"
            ["_score"]=>
            float(1)
            ["_source"]=>
            array(2) {
              ["@timestamp"]=>
              string(20) "2019-03-28T11:23:52Z"
              ["user_id"]=>
              int(299)
            }
          }
          [90]=>
          array(5) {
            ["_index"]=>
            string(36) "accesslog-2019.03.28"
            ["_type"]=>
            string(3) "doc"
            ["_id"]=>
            string(20) "3yEKxGkB18T84ql3g4oq"
            ["_score"]=>
            float(1)
            ["_source"]=>
            array(1) {
              ["@timestamp"]=>
              string(24) "2019-03-28T11:23:36.020Z"
            }
          }
    
    

    3、优缺点

          可以看出来是两个索引下的数据,查出来之后是分散的数组。对于这种查询方式,最佳的用法是不同索引的结构完全相同,比如日志索引access_20190426access_20190427,这种结构相同的情况下,进行多索引联合查询是很合适的。

    优点:

    1、 对结构相同或者大部分字段相同的索引,可以使用这种方式进行多索引联合查询
    2、 直接查询出来的就是数组,根据索引名处理下数组即可。还可以直接在查询出来的基础上进行聚合操作

    缺点:

    1、 如果索引的字段不同,就比如这里的user1和accesslog-2019.03.28,查询结果是出来了,但是如果要进行聚合操作,那么只能各自聚合各自的字段,不能进行子聚合。
    2、 查询条件必须同时符合多个索引,但在业务层面,比如mysql的联表查询中,并不是要求每个表都必须遵循相同的查询条件的,可能只是a.id=b.id的关联关系。

    三、如果要实现类似于mysql的联合查询

          首先,我们都知道,mysql做联合查询,表的字段都是有关联的,那么使用上面这种方式肯定是不行的,或者局限性很大。不可能让关联的索引保持字段都一致,业务上也说不过去。

    1、网上的方案

    网上的方案一般分为四种,这里参考: https://blog.csdn.net/laoyang360/article/details/79774481
    (1)、应用端关联
    (2)、宽表冗余存储(Data denormalization)
    (3)、嵌套文档(Nested)存储
    (4)、父子文档存储

          如果数据量不是很大的话,使用客户端join,也就是在业务层面查询两次也能实现类似于join的操作。如果数据量适中,多个索引之间联系紧密,比如博客和评论的关系,那么是可以考虑Nested&Join方式的,只是比较影响性能。nested 类型检索使得检索效率慢几倍,父子Join 类型检索会使得检索效率慢几百倍。

          如果你多索引是类似于博客表和用户表关联,关系不是很紧密且数据量很大的话,最好是采用宽表的方式。如果业务端对查询性能要求很高的话,还是建议使用宽表化处理的方式,这样也可以比较好地应对聚合的需求。在索引阶段需要做join处理,查询阶段可能需要做去重处理,分页方式可能也得权衡考虑下。

    2、其次

          我们要知道,ES和大多数的nosql相似,想要处理mysql这种关联关系还是有些强人所难了。最好是在设计阶段就尽量设计成扁平化的文档模型,用拼接json的方式去处理数据,而不是还按照传统关系型数据库的思维去使用ES。性能和关联关系不可兼得,ES既然选择了性能,那就别嫌弃它处理关联不方便吧。

          博主的需求是分析日志于用户之间的关系,最终选用的方案是宽表模式,也就是咱们常说的数据冗余。毕竟数据量挺大的,采用其他方案都很影响效率。这个大家仁者见仁智者见智了,总之要改变自己的思维,关联起来太难了!

    end

    展开全文
  • 想在ElasticSearch中通过dsl实现与下面sql语句相等的效果: select user_name,user_code from table1 where user_name like '张%' union all select usrname as user_name,usrcode as user_code from table2 where ...
  • Elasticsearch索引维护

    2021-01-07 04:54:22
    Elasticsearch存储数据之前需要先创建索引,类似于结构型数据库建库建表,创建索引时定义了每个字段的索引方式和数据类型。  常用API: 1、查看指定索引信息: GET http://$user:$passwd@$host:$port/$index 2:...
  • Elasticsearch 7.7版中跨索引查询

    千次阅读 2021-07-16 14:57:37
    In elastic search version 7.7, multiple _types in the index is removed,Now If we want to query across multiple index, we are doing in the following way./index1,index2/_search?q=type:tweetIn 7.7, what ...

    In elastic search version 7.7, multiple _types in the index is removed,

    Now If we want to query across multiple index, we are doing in the following way.

    /index1,index2/_search?q=type:tweet

    In 7.7, what is the best way to query from multiple indexes using Transport Java API?

    Edited :

    1) Say I have two indexes, "user" and "tweet" I want to search both the index - user and tweet like below

    If I want to query the "user" index on the field as {"username" = "Opster"}

    and in "tweet" index on the field as {"data" = "some_text"}

    Is this possible?

    2) I understand, each index is a separate partition in elastic search but How does the search across indexes work internally in elastic search?

    Thanks,

    Harry

    解决方案

    I think the below code should help. Note that you can create TransportClient client instance as mentioned in this link

    In order to execute the search using the Java API, the below code should help:

    SearchResponse response = client.prepareSearch("index1", "index2")

    .setSearchType(SearchType.DFS_QUERY_THEN_FETCH)

    .setQuery(QueryBuilders.termQuery("type", "tweet")) // Query

    .setFrom(0).setSize(60) // Set whatever size you'd want

    .get();

    Some of the below useful API links:

    Note: ES recommends people to migrate to Java Rest Client as mentioned in this link and this guide should help you as how you can migrate from Java API to using the REST Client.

    Updated Answer:

    Assuming that I have two indexes

    user having field username with value Opster

    tweet having field data with value some text

    For the sake of simplicity I have made both the fields keyword type

    What you are looking for would be as below

    In Elasticsearch's Query DSL:

    POST /_search

    {

    "query": {

    "bool": {

    "should": [

    {

    "bool": {

    "must": [

    {

    "term": {

    "_index": "user"

    }

    },

    {

    "term": {

    "username": "Opster"

    }

    }

    ]

    }

    },

    {

    "bool": {

    "must": [

    {

    "term": {

    "_index": "tweet"

    }

    },

    {

    "term": {

    "data": "some text"

    }

    }

    ]

    }

    }

    ]

    }

    }

    }

    Java API:

    import java.net.InetAddress;

    import java.net.UnknownHostException;

    import org.elasticsearch.action.search.SearchResponse;

    import org.elasticsearch.action.search.SearchType;

    import org.elasticsearch.client.transport.TransportClient;

    import org.elasticsearch.common.settings.Settings;

    import org.elasticsearch.common.transport.TransportAddress;

    import org.elasticsearch.index.query.BoolQueryBuilder;

    import org.elasticsearch.index.query.QueryBuilder;

    import org.elasticsearch.index.query.QueryBuilders;

    import org.elasticsearch.transport.client.PreBuiltTransportClient;

    public class QueryForMultipleIndexes {

    public static void main(String[] args) throws UnknownHostException {

    // on startup

    TransportClient client = new PreBuiltTransportClient(Settings.EMPTY)

    .addTransportAddress(new TransportAddress(InetAddress.getByName("127.0.0.1"), 9300));

    QueryBuilder firstQuery = new BoolQueryBuilder()

    .must(QueryBuilders.termQuery("_index", "user"))

    .must(QueryBuilders.termQuery("username", "Opster"));

    QueryBuilder secondQuery = new BoolQueryBuilder()

    .must(QueryBuilders.termQuery("_index", "tweet"))

    .must(QueryBuilders.termQuery("data", "some text"));

    //This is the should clause which in turn contains two must clause

    QueryBuilder mainQuery = new BoolQueryBuilder()

    .minimumShouldMatch(1)

    .should(firstQuery).should(secondQuery);

    SearchResponse response = client.prepareSearch("*")

    .setSearchType(SearchType.DFS_QUERY_THEN_FETCH)

    .setQuery(mainQuery)

    .setFrom(0).setSize(60)

    .get();

    System.out.println(response.getHits().getTotalHits());

    // on shutdown

    client.close();

    }

    }

    Below is what should appear in the output/console:

    2 hits

    Let me know if this helps!

    展开全文
  • es-reindex-用于复制ElasticSearch索引的简单ruby脚本 简单的ruby脚本,用于复制和重新索引ElasticSearch索引,复制索引设置和映射。 在滚动过程中将显示进度和时间估计。 要求 需要Ruby 1.8.6或更高版本,为方便...
  • Elasticsearch查询多索引

    千次阅读 2020-10-19 07:18:25
    您可能有个原因,可能会对Elasticsearch集群中的给定应用程序使用索引。最受欢迎的事实之一是删除索引非常有效(而删除许多文档则效率不高)。如果您的应用程序经常添加和删除数据,这将很有用。例如,如果您...
  • ES 的跨索引查询详细讲解

    万次阅读 2020-12-20 00:21:32
    序言Elasticsearch,中文名直译弹性搜索,不仅仅在单索引内部分片层面弹性搜索,更强的是在跨索引外围支持分片弹性搜索,同比其它分布式数据产品,此特性更鲜明,代表了 Elastic 集群架构设计的优越性。本文将从以下...
  • Es多索引查询

    千次阅读 2020-12-17 16:50:38
    Elasticsearch 7.7版中跨索引查询(Query across multiple index in the Elasticsearch version 7.7) 今天一键查询遇到一个问题,需要同时查询es表中索引,我可以分别查询出,在内存中处理,但是无法分页,...
  • Elasticsearch是一个分布式、Restful的搜索及分析服务器,Apache Solr一样,它也是基于Lucence的索引服务器,但我认为Elasticsearch对比Solr的优点在于: 轻量级:安装启动方便,下载文件之后一条命令就可以启动; ...
  • 最近在做项目的时候,遇到一个问题,要访问不同索引(可以当成分库去理解),如果是用直接请求的方式很容易做到,但是用了spring-data-elasticsearch好像不是很好实现,在网上看到基本上都是indexName直接赋值。...
  • 首先,博主这边要用ES来代替传统的mysql操作,那么原来的表联合查询操作自然也要转换为多索引联合查找。这里使用elasticsearch-php库来操作ES,原生的ES也是大同小异的。 日期查询优秀文章参考: 1、 自定义日期格式...
  • 一、Elasticsearch部署建议 1.选择合理的硬件配置 尽可能使用SSD Elasticsearch最大的瓶颈往往是磁盘读写性能,尤其是随机读取性能。使用SSD(PCI-E接口SSD卡/SATA接口SSD盘)通常比机械硬盘(SATA盘/SAS盘)查询...
  • 我的版本是elasticsearch7.6.2、spring-boot-starter-data-elasticsearch-2.5.6
  • Elasticsearch查询索引

    2022-02-23 00:04:21
    查询索引名包含"log"字符串的索引列表 _cat/indices?format=json&index='*log*' 哪个索引的文件数最多? GET /_cat/indices?v&s=docs.count:desc 哪些索引状态是 yellow ? GET /_cat/indices?v&...
  • 1、首先定义indexName的赋值类 public class EsIndexChange { ...然后再需要换索引的时候,setSuffix就可以了。   原文:https://blog.csdn.net/duanqiaocanyue2012/article/details/82843309   
  • Elasticsearch基础 es索引查询

    千次阅读 2021-04-15 10:25:11
    es与关系数据库的对比,方便理解 es 关系型数据库 index database type table document row (行数据) field column (列数据) 传统关系型数据库中,我们是把数据存入一个database里的某个table...
  • es创建索引 查询数据 删除索引教程.docx
  • Spring Boot Elasticsearch高级查询实现-ES索引别名聚合查询 引入依赖 <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-elastic...
  • 我的版本是elasticsearch7.6.2、spring-boot-starter-data-elasticsearch-2.5.6
  • Elasticsearch7.0备份索引脚本,配置linux crontab可以自定完成定时备份功能,希望大家给个好评,谢谢
  •  另外索引创建之后,数据库数据如有改动,索引无法联动修改,ElasticSearch没有相关功能,我们只能根据修改频率重建索引,基本上没有实时性可言。  db-river-es正是为了解决这些问题而生。 项目介绍 名称:es-...
  • 参考:【Elasticsearch】使用 Elasticsearch Freeze index API 创建冻结索引Elasticsearchelasticsearch 索引 如何用DSL搜索冻结索引? 通过向请求中添加 ignore_throttled=false GET /sampledata/_search?...
  • 主要介绍了ElasticSearch合理分配索引分片原理,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
  • 当我们查询时会遇到一些按照月份做索引的情况,要用到这些索引,得根据前缀来查这些索引 话不说,直接上代码 public class IndexUtils { public static String[] show(String index) {//参数写自己索引的前缀 ...
  • 【Elasticsearch】- elasticsearch索引的创建、查询和删除

    千次阅读 多人点赞 2022-06-03 22:00:05
    进入bin目录,双击elasticsearch.bat运行。 Elasticsearch启动后会暴露两个端口:Postman是一个接口测试工具。在做接口测试的时候,Postman相当于一个客户端,它可以模拟用户发起的各类HTTP请求,将请求数据发送至...
  • elasticsearch多索引的数据联查

    万次阅读 热门讨论 2019-01-16 14:36:39
    1.数据入库 PUT /my_index/user/1 { "name": "John Smith", ... "dob": "1970/10/24" } PUT /your_index/blogpost/2 ...2.my_index库和your_index库一句查询语句查出 GET /my_index,your_index/_search

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 148,327
精华内容 59,330
关键字:

es多索引查询