精华内容
下载资源
问答
  • 我在使用java对elasticsearch进行聚合查询,并对某个字段进行排序时,报错了 ,Java代码如下:publicMapsearchOnParamByPage(ElasticsearchConfigelasticsearchConfig,String[]indices,StringsortField,...

    我在使用java 对elasticsearch 进行聚合查询,并对某个字段进行排序时,报错了 ,Java代码如下:public Map searchOnParamByPage(ElasticsearchConfig elasticsearchConfig,

    String[] indices,

    String sortField,

    String fieldKey,

    String fieldVal,

    int from, int size) throws IOException

    {

    SearchRequest searchRequest = new SearchRequest(indices);

    SearchSourceBuilder sourceBuilder = new SearchSourceBuilder();

    sourceBuilder.query(QueryBuilders.matchPhraseQuery(fieldKey, fieldVal));

    sourceBuilder.from(from);

    sourceBuilder.size(size);

    sourceBuilder.timeout(new TimeValue(1000));

    sourceBuilder.trackTotalHits(true);

    sourceBuilder.sort(new FieldSortBuilder(sortField).order(SortOrder.DESC));

    searchRequest.source(sourceBuilder);

    if (client == null) {

    initClient(elasticsearchConfig);

    }

    SearchResponse searchResponse = client

    .search(searchRequest,

    RequestOptions.DEFAULT);

    SearchHits hits = searchResponse.getHits();

    TotalHits totalHits = hits.getTotalHits();

    long totalSize = totalHits.value;

    SearchHit[] searchHits = hits.getHits();

    Map resultMap = new HashMap();

    List> resultList = new ArrayList>();

    Map sourceMap = null;

    for (SearchHit searchHit : searchHits) {

    sourceMap = searchHit.getSourceAsMap();

    resultList.add(sourceMap);

    }

    closeClient();

    logger.info("单条件分页查询时,查询出的总条数为:【{}】", totalSize);

    resultMap.put(BobfintechContant.DATA_LIST, resultList);

    resultMap.put(BobfintechContant.DATA_SIZE, totalSize);

    return resultMap;

    }

    报错信息如下:Caused by: ElasticsearchException[Elasticsearch exception [type=illegal_argument_exception, reason=Fielddata is disabled on text fields by default. Set fielddata=true on [userName] in order to load fielddata in memory by uninverting the inverted index. Note that this can however use significant memory. Alternatively use a keyword field instead.]]; nested: ElasticsearchException[Elasticsearch exception [type=illegal_argument_exception, reason=Fielddata is disabled on text fields by default. Set fielddata=true on [userName] in order to load fielddata in memory by uninverting the inverted index. Note that this can however use significant memory. Alternatively use a keyword field instead.]];

    看了下官方的文档,其说明如下(官方文档):Fielddata can consume a lot of heap space, especially when loading high cardinality text fields. Once fielddata has been loaded into the heap, it remains there for the lifetime of the segment. Also, loading fielddata is an expensive process which can cause users to experience latency hits. This is why fielddata is disabled by default.

    If you try to sort, aggregate, or access values from a script on a text field, you will see this exception:

    Fielddata is disabled on text fields by default.  Set `fielddata=true` on

    [`your_field_name`] in order to load  fielddata in memory by uninverting the

    inverted index. Note that this can however use significant memory.

    97f40927a729120d769d0bacd44909f3.png

    大意是说,使用字段查询非常消耗内存,因此默认是禁用字段查询,如果您非要使用字段进行排序,汇总或访问值的话,则会看到上面的那个异常,解决办法是在[`your_field_name`] 上设置`fielddata = true`,以通过反转取

    反的索引将字段数据加载到内存中。但是这可能会占用大量内存。

    有了上述官方说明,我们就知道了如何解决,剩下的就是如何把`fielddata = true`在程序中设置了。

    按照官方的说法,查找了很多资料,都没找到具体在JAVA程序中该如何设置,只有通过语句查询方法PUT you_index/_mapping/

    {

    "properties": {

    "字段":{

    "type": "text",

    "fielddata": true

    }

    }

    }

    作为依赖JAVA操作程序的我们,怎么去转化为程序的参数设置呢,不好意思,我还真没找到,但是我找到了另外一种解决办法,那就是在你要排序的字段上加上“.keyword”

    例如:sourceBuilder.sort(new FieldSortBuilder(sortField + ".keyword").order(SortOrder.DESC));

    上面的代码中,在对sortField排序时,在这个属性后面加上.keyword即可,给字段加上.keyword 表示使用完整的字段,无需修改es,也无需修改代码逻辑。

    运行不在报错。

    或者使用另一种实现方式:/**

    * 单条件分页查询

    *

    * @param elasticsearchConfig

    *            配置

    * @param indices

    *            索引(非必填)

    * @param sortField

    *            排序字段

    * @param fieldKey

    *            查询条件(KEY)

    * @param fieldVal

    *            查询条件(value)

    * @param from

    *            开始条数

    * @param size

    *            要查询的条数

    * @throws IOException

    */

    public Map testQueryByPage(ElasticsearchConfig elasticsearchConfig, String[] indices,

    String sortField,

    String fieldKey, String fieldVal, int from, int size) throws IOException

    {

    BoolQueryBuilder boolQuery = new BoolQueryBuilder();

    RangeQueryBuilder rangeQuery = QueryBuilders.rangeQuery(sortField).gte(null); // "count"

    boolQuery.filter(rangeQuery);

    MatchQueryBuilder matchQuery = new MatchQueryBuilder(fieldKey, fieldVal);

    boolQuery.must(matchQuery);

    if (client == null) {

    initClient(elasticsearchConfig);

    }

    SearchResponse searchResponse = client

    .search(

    new SearchRequest(

    indices)

    .source(new SearchSourceBuilder().query(boolQuery).from(from).size(size)

    .trackTotalHits(true)),

    RequestOptions.DEFAULT);

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

    // System.out.println(response.toString());

    // closeClient();

    SearchHits hits = searchResponse.getHits();

    TotalHits totalHits = hits.getTotalHits();

    long totalSize = totalHits.value;

    SearchHit[] searchHits = hits.getHits();

    Map resultMap = new HashMap();

    List> resultList = new ArrayList>();

    Map sourceMap = null;

    for (SearchHit searchHit : searchHits) {

    sourceMap = searchHit.getSourceAsMap();

    resultList.add(sourceMap);

    }

    closeClient();

    logger.info("单条件分页查询时,查询出的总条数为:【{}】", totalSize);

    resultMap.put(BobfintechContant.DATA_LIST, resultList);

    resultMap.put(BobfintechContant.DATA_SIZE, totalSize);

    return resultMap;

    }

    /**

    * 关闭ES客户端

    */

    public void closeClient()

    {

    try {

    if (client != null) {

    client.close();

    }

    client = null;

    }

    catch (Exception e2) {

    e2.printStackTrace();

    System.out.println("关闭客户端失败");

    }

    }

    注意,报错的代码是我自己定义的一些常量,自己改下就可以。

    展开全文
  • 1 Hibernate数据库操作类(eg:TexDAO.java) ... 4 * queryString HQL语句,first开始条数, max输出条数 ,norder排序 5 * 例: List lis = dao.findOther("from Tex",2,10," uid desc "); 6 */ 7 ...
     1 Hibernate数据库操作类(eg:TexDAO.java)
     2 
     3     /*
     4      * queryString HQL语句,first开始条数, max输出条数 ,norder排序
     5      * 例: List lis = dao.findOther("from Tex",2,10," uid desc ");
     6      */
     7     public List findOther(String queryString, int first, int max, String norder) {
     8         StringBuffer sb = new StringBuffer();
     9 
    10         // 这里是hibernate 对应的bean名并非实际表,这个实际对应的是视图
    11         sb.append(queryString);
    12 
    13         // 从大到小排序
    14         sb.append(" order by "+norder);
    15         Query queryObject = getSession().createQuery(sb.toString());
    16 
    17         // 开始条数
    18         queryObject.setFirstResult(first);
    19 
    20         // 输出条数
    21         queryObject.setMaxResults(max);
    22         return queryObject.list();
    23     }
    24 
    25 
    26 
    27 Action业务逻辑类(eg:TexAction.java)
    28 
    29 public String list_tex2() {
    30         lis = dao.findOther("from Tex",2,10," uid desc ");
    31         
    32         //测试
    33         for (Tex t : lis) {
    34             System.out.println("编号:" + t.getUid());
    35             System.out.println("姓名:" + t.getUtname());
    36         }
    37         return "success";
    38     }

     

    转载于:https://www.cnblogs.com/huanglibin/p/3572088.html

    展开全文
  • 查询出的文档进行条数的限制(适用于分页)以及比较运算符(>,>=,<,<,<=,!=)的使用。下面我将实例代码贴出来,我已经将注释在代码中标注。同学们可以按照这个进行揣摩和理解...

    上一篇文章我们学习了使用Java对MongoDB进行基本的增删改查操作。这次我们进一步来学习如何使用Java对MongoDB进行复杂查询。其中包含对查询出的文档按照某个字段进行排序。对查询出的文档进行条数的限制(适用于分页)以及比较运算符(>,>=,<,<,<=,!=)的使用。下面我将实例代码贴出来,我已经将注释在代码中标注。同学们可以按照这个进行揣摩和理解。

    注:

    1.为什么在条件排序后需要加上limit限制条数:因为排序后的文档数量可能过大,超过最大缓存32M,大家可以百度来增大缓存,或者像我一样加个limit限制,在不影响业务的前提下。

    public class QueryMain {
    
    	public static void main(String[] args) {
    		// 查询限制条数,limit的使用
    		findDocumentByLimit();
    		// 查询按照某个条件倒序排列,sort的使用
    		findDocumentBySort();
    		// 查询带有比较运算条件>,>=,<,<=,!=的使用
    		findDocumentByRelation();
    	}
    
    	// 进行分页查询,限制查询出的数据条数
    	public static void findDocumentByLimit() {
    		try {
    			MongoClient mongoClient = MongoUtils.mongoClient;
    			MongoDatabase database = mongoClient.getDatabase("testDB");
    			MongoCollection<Document> collection = database.getCollection("testCollection");
    			// 组装文档
    			BasicDBObject searchDoc = new BasicDBObject().append("id", 1);
    			// 进行查询
    			FindIterable<Document> find = collection.find(searchDoc).limit(10);
    			for (Document document : find) {
    				System.out.println(document.getInteger("id") + "\t" + document.getString("name") + "\t"
    						+ document.getString("sex") + "\t" + document.getDate("date"));
    			}
    		} catch (Exception e) {
    			e.printStackTrace();
    		}
    	}
    
    	/**
    	 * 按照某个条件排序查询,并限制查询的条数。 sort('字段名',num)方法的参数num为排序的方式,1为升序,-1为降序
    	 */
    	public static void findDocumentBySort() {
    		try {
    			MongoClient mongoClient = MongoUtils.mongoClient;
    			MongoDatabase database = mongoClient.getDatabase("testDB");
    			MongoCollection<Document> collection = database.getCollection("testCollection");
    			// 组装文档
    			BasicDBObject searchDoc = new BasicDBObject().append("id", 1);
    			// 查询,排序并限制条数(查询的数量太大进行排序会导致内存溢出而报错)
    
    			FindIterable<Document> find = collection.find(searchDoc).sort(new Document().append("id", -1)).limit(10);
    			for (Document document : find) {
    				System.out.println(document.getInteger("id") + "\t" + document.getString("name") + "\t"
    						+ document.getString("sex") + "\t" + document.getDate("date"));
    			}
    		} catch (Exception e) {
    			e.printStackTrace();
    		}
    	}
    
    	// 带有比较运算符的条件查询,并限制查询的条数
    	public static void findDocumentByRelation() {
    		try {
    			MongoClient mongoClient = MongoUtils.mongoClient;
    			MongoDatabase database = mongoClient.getDatabase("testDB");
    			MongoCollection<Document> collection = database.getCollection("testCollection");
    			// 组装文档,将关系运算符嵌套在条件中。
    			// 大于:$gt,大于等于:$gte,小于:$lt,小于等于:$lte,不等于:$ne
    			BasicDBObject searchDoc = new BasicDBObject().append("id", new Document().append("$lt", 10));
    			// 查询限制条数(查询的数量太大进行排序会导致内存溢出而报错)
    
    			FindIterable<Document> find = collection.find(searchDoc).limit(10);
    			for (Document document : find) {
    				System.out.println(document.getInteger("id") + "\t" + document.getString("name") + "\t"
    						+ document.getString("sex") + "\t" + document.getDate("date"));
    			}
    		} catch (Exception e) {
    			e.printStackTrace();
    		}
    	}
    
    }

     

    喜欢的朋友点个赞哦~~

    展开全文
  • MongoDB使用find()方法查询后,可能需要对于返回结果进行排序。在有些查询中,我们并不需要返回全部结果,而是按指定的页长和页码返回指定数量的结果1.limit()指定查询结果数量find()方法查询文档后,其默认返回前20...

    MongoDB使用find()方法查询后,可能需要对于返回结果进行排序。在有些查询中,我们并不需要返回全部结果,而是按指定的页长和页码返回指定数量的结果

    1. limit()指定查询结果数量

    find()方法查询文档后,其默认返回前20条数据。要限制MongoDB查询结果数,使用limit()方法,该方法接受一个数字值,表示要返回的结果数。

    limit()语法结构

    db.COLLECTION_NAME.find().limit(NUMBER)

    例如,现有sites数据集合,集合数据如下:

    { "_id" : ObjectId("56999ca102129bdec412ed38"), "name" : "IT笔录", "domain" : "itbilu.com" }

    { "_id" : ObjectId("56999ca902129bdec412ed39"), "name" : "老聂", "domain" : "niefengjun.cn" }

    { "_id" : ObjectId("56999cb102129bdec412ed3a"), "name" : "一介布衣", "domain" : "yijiebuyi.com" }

    查询该集合,只返回第一条数据:

    > db.sites.find().limit(1)

    { "_id" : ObjectId("56999ca102129bdec412ed38"), "name" : "IT笔录", "domain" : "itbilu.com" }

    2. skip()指定查询偏移量

    在使用SQL查询的数据库(如:mySQL、PostgreSQL)中,可以使用limit 数量,偏移量或使用limit 数量 offset 偏移量实现数据的分页查询。而在MongoDB中,可以使用skip()方法,指定偏移量,该也接受一个表示数量的参数。

    skip()语法结构

    db.COLLECTION_NAME.find().limit(NUMBER).skip(NUMBER)

    例如,使用skip()查询sites集合中的第二个文档:

    > db.sites.find().limit(1).skip(1)

    { "_id" : ObjectId("56999ca902129bdec412ed39"), "name" : "老聂", "domain" : "niefengjun.cn" }

    3. sort()实现查询结果排序

    对MongoDB的查询文档进行排序,要使用sort()方法。sort()方法接受一个文档,其中包含的排序的字段,及要指定排序方式。排序方式为可选值为:1和-1,1表示使用升序排列,-1表示降序排序。

    sort()语法结构

    db.COLLECTION_NAME.find().sort({KEY:1})

    例如,查询sites数据集合,分别按name升序和降序两种试查询:

    > db.sites.find().sort({name:1})

    { "_id" : ObjectId("56999ca102129bdec412ed38"), "name" : "IT笔录", "domain" : "itbilu.com" }

    { "_id" : ObjectId("56999cb102129bdec412ed3a"), "name" : "一介布衣", "domain" : "yijiebuyi.com" }

    { "_id" : ObjectId("56999ca902129bdec412ed39"), "name" : "老聂", "domain" : "niefengjun.cn" }

    > db.sites.find().sort({name:-1})

    { "_id" : ObjectId("56999ca902129bdec412ed39"), "name" : "老聂", "domain" : "niefengjun.cn" }

    { "_id" : ObjectId("56999cb102129bdec412ed3a"), "name" : "一介布衣", "domain" : "yijiebuyi.com" }

    { "_id" : ObjectId("56999ca102129bdec412ed38"), "name" : "IT笔录", "domain" : "itbilu.com" }

    展开全文
  • Java基于反射的内存分页排序序言应用场景程序源码 序言 提到分页,我想大部分开发者首先会想到数据库分页技术。是的,正常情况下分页排序我们都会交给数据库来做,毕竟这么做省时省力...这里主要是针对成千上万条数...
  • 分页:其实标准查询的分页很简单,在Criteria中提供了两个方法,setFirstResult方法和setMaxResults,一个是数据的开始位置0表示第一记录,一个是返回的记录Java代码publicvoidsearchByPropertys(){Session...
  • 有新闻表news,有地区属性area_id,创建时间属性create_time(),随便时间戳,或日期类型均可,不是重点 有地区表area,有area_id,...用java解答或php都行,数据库用mysql,因为可以用limit 不用存储过程,我不会用
  • //每页显示记录 以之前的ADDRESSBOOK数据表为例(每页显示10记录): 一、SqlServe 下载 数据库分页语句 Java代码 Stringsql= selecttop pageRecord *fromaddressbook★先来定义分页语句将要用到的几个参数:i...
  • 在实践中我们会遇到这样的问题,知道某记录的id,然后需要判断此记录如果按照id进行排序分页,此记录在第几页。今天这篇文章为大家提供一个思路。 下面话不多说了,来一起看看详细的实现方法吧 根据ID查询分页...
  • java爬虫实现代码

    2020-03-22 10:07:56
    使用maven框架内置多种所用的jar包,通过爬取csdn博主的近两万...再通过SQL语句可以方便查询排序,看到每个博主博客 点赞、阅读量、评论等数据并且可以据此进行排序。 相关教程请看博客 java爬虫项目(1)-(10)
  • java面试题典 java 面试题 经典

    热门讨论 2010-06-18 13:42:36
    8. 用JAVA实现一种排序JAVA类实现序列化的方法(二种)? 如在COLLECTION框架中,实现比较要实现什么样的接口? 49 9. 编程:编写一个截取字符串的函数,输入为一个字符串和字节,输出为按字节截取的字符串。 但是...
  • java 网络爬虫项目(10)

    2020-03-22 10:02:31
    可以通过java中的绘制图表 进行排序展示,也可以对控件进行操作等来实现 , 可以通过sql 语句进行查询排序、展示 等操作 项目的源代码已上传的博客资源中 截图展示如下: (比如我要查看周榜排第三位的博主评论...
  • 疯狂JAVA讲义

    2014-10-17 13:35:01
    11.6.1 菜单、菜单和菜单项 414 11.6.2 右键菜单 416 学生提问:为什么即使我没有给多行文本域编写右键菜单,但当我在多行文本域上单击右键时一样会弹出右键菜单? 418 11.7 在AWT中绘图 418 11.7.1 画图的...
  • 分页查询

    2016-01-07 14:19:42
    //PageUtil.javapublic class PageUtil { /** * PO分页查询,分页信息设置(排序) ... * @param row 每页条数 * @param sortorder 排序规则,升序还是降序 * @param sortfield 排序列 * @
  • JAVA上百实例源码以及开源项目

    千次下载 热门讨论 2016-01-03 17:37:40
     [ConfigLine.java] 控制类  [RoundBox.java] 限定选择控件  [MonthMaker.java] 月份表算法类  [Pallet.java] 调色板,统一配色类 Java扫雷源码 Java生成自定义控件源代码 2个目标文件 Java实现HTTP...
  • java面试宝典

    2013-02-28 16:04:01
    20、以下二语句返回值为true 的有: 10 21、当一个对象被当作参数传递到一个方法后,此方法可改变这个对象的属性,并可返回变化后的结果,那么这里到底是值传递还是引用传递? 10 22、我们在web 应用开发过程中经常...
  • 一、MongoDB分页1.skip实现跳页(比较简单)/***db.getCollection('user').find({})是指查询全部。*sort()设置排序,本示例是指以_id作为条件,正序排序。若将数字1改为-1,则为倒序。*skip()设置跳页,本示例是指跳过...
  • java面试宝典2012

    2012-12-16 20:43:41
    8.用一SQL语句 查询出每门课都大于80分的学生姓名 109 9.所有部门之间的比赛组合 109 10.每个月份的发生额都比101科目多的科目 110 11.统计每年每月的信息 111 12.显示文章标题,发帖人、最后回复时间 112 13.删除...
  • PagingOperation数据库SQLServer2008分页存储过程(和java调用存储过程源代码): ...支持多字段) -- 条件语句(不用加where)-- 指定当前为第几页 每页多少条记录 --分组语句(不用加Group by) --返回总记录条数
  • 日历表格面板 [ConfigLine.java] 控制类 [RoundBox.java] 限定选择控件 [MonthMaker.java] 月份表算法类 [Pallet.java] 调色板,统一配色类 Java扫雷源码 Java生成自定义控件源代码 2个目标文件 Java实现HTTP连接...
  • JAVA面试宝典2010

    2011-12-20 16:13:24
    8.用一SQL语句 查询出每门课都大于80分的学生姓名 100 9.所有部门之间的比赛组合 100 10.每个月份的发生额都比101科目多的科目 101 11.统计每年每月的信息 102 12.显示文章标题,发帖人、最后回复时间 103 13.删除...
  • Java2实用教程.rar

    2014-11-10 10:33:17
    15 5排序查询 15 6模糊查询 15 7随机查询 15 8更新 添加 删除记录 l5 9预处理语句 15 10数据库访问中的套接字技术 习题 第16章Java与多媒体 16 1在小程序中播放音频 16 2在另一个线程中创建音频对象 16 3在应用程序...
  • Java面试宝典-经典

    2015-03-28 21:44:36
    8.用一SQL语句 查询出每门课都大于80分的学生姓名 100 9.所有部门之间的比赛组合 100 10.每个月份的发生额都比101科目多的科目 101 11.统计每年每月的信息 102 12.显示文章标题,发帖人、最后回复时间 103 13.删除...
  • java面试800题

    2011-09-13 20:25:48
    2.因为SQL是从右向左解析,多表查询时,记录少的表放在右边 3.多个条件时,收敛快的条件放在右边。 4.避免使用复杂的集合函数,象not in等。 5.避免在条件中对字段进行函数操作 6.尽量避免使用select *,应该写出...
  • Java 面试宝典

    2013-02-01 10:02:08
    37、下面这语句一共创建了多少个对象:String s="a"+"b"+"c"+"d"; .................. 25 38、try {}里有一个 return 语句,那么紧跟在这个 try 后的 finally {}里的 code 会不 会被执行,什么时候被执行,在 ...
  • 最新Java面试宝典pdf版

    热门讨论 2011-08-31 11:29:22
    8.用一SQL语句 查询出每门课都大于80分的学生姓名 100 9.所有部门之间的比赛组合 100 10.每个月份的发生额都比101科目多的科目 101 11.统计每年每月的信息 102 12.显示文章标题,发帖人、最后回复时间 103 13.删除...
  • Java面试宝典2012版

    2012-12-03 21:57:42
    8.用一SQL语句 查询出每门课都大于80分的学生姓名 100 9.所有部门之间的比赛组合 100 10.每个月份的发生额都比101科目多的科目 101 11.统计每年每月的信息 102 12.显示文章标题,发帖人、最后回复时间 103 13...
  • Java面试宝典2012新版

    2012-06-26 19:20:00
    8.用一SQL语句 查询出每门课都大于80分的学生姓名 100 9.所有部门之间的比赛组合 100 10.每个月份的发生额都比101科目多的科目 101 11.统计每年每月的信息 102 12.显示文章标题,发帖人、最后回复时间 103 13.删除...

空空如也

空空如也

1 2 3 4 5 6
收藏数 114
精华内容 45
关键字:

java查询条数排序

java 订阅