-
2020-12-22 22:14:00
多值字段字符串排序
译者注: 多值字段是指同一个字段在ES索引中可以有多个含义,即可使用多个分析器(analyser)进行分词与排序,也可以不添加分析器,保留原值。
被分析器(analyser)处理过的字符称为analyzed field(译者注:即已被分词并排序的字段,所有写入ES中的字段默认圴会被analyzed), analyzed字符串字段同时也是多值字段,在这些字段上排序往往得不到你想要的值。 比如你分析一个字符 "fine old art",它最终会得到三个值。例如我们想要按照第一个词首字母排序, 如果第一个单词相同的话,再用第二个词的首字母排序,以此类推,可惜 ElasticSearch 在进行排序时 是得不到这些信息的。
当然你可以使用 min 和 max 模式来排(默认使用的是 min 模式)但它是依据art 或者 old排序, 而不是我们所期望的那样。
为了使一个string字段可以进行排序,它必须只包含一个词:即完整的not_analyzed字符串(译者注:未经分析器分词并排序的原字符串)。 当然我们需要对字段进行全文本搜索的时候还必须使用被 analyzed 标记的字段。
在 _source 下相同的字符串上排序两次会造成不必要的资源浪费。 而我们想要的是同一个字段中同时包含这两种索引方式,我们只需要改变索引(index)的mapping即可。 方法是在所有核心字段类型上,使用通用参数 fields对mapping进行修改。 比如,我们原有mapping如下:
"tweet": {
"type": "string",
"analyzer": "english"
}
改变后的多值字段mapping如下:
"tweet": { <1>
"type": "string",
"analyzer": "english",
"fields": {
"raw": { <2>
"type": "string",
"index": "not_analyzed"
}
}
}
`tweet` 字段用于全文本的 `analyzed` 索引方式不变。 新增的 `tweet.raw` 子字段索引方式是 `not_analyzed`。 现在,在给数据重建索引后,我们既可以使用 `tweet` 字段进行全文本搜索,也可以用`tweet.raw`字段进行排序: ```Javascript GET /_search { "query": { "match": { "tweet": "elasticsearch" } }, "sort": "tweet.raw" } ``` >**警告**: >对 `analyzed` 字段进行强制排序会消耗大量内存。 >详情请查阅《字段类型简介》相关内容。
更多相关内容 -
第86篇ES之索引多值字段检索及多值字段及匹配选项成功
2017-03-28 14:40:18关键词:索引多值字段检索,多值字段,匹配选项成功 一、索引多值字段检索 1.1 多值字段是什么? 如下图所示: 注:上图中Problem是mongo数据库dzplib的一个表(应该叫Collection),comments及content都是表的字段...关键词:索引多值字段检索,多值字段,匹配选项成功
一、索引多值字段检索
1.1 多值字段是什么?
如下图所示:
注:上图中Problem是mongo数据库dzplib的一个表(应该叫Collection),comments及content都是表的字段,也就是一级字段;而content里面又包括如:docLibID,elementContent,elementName等字段,我把它称作多值字段。
1.2 如何检索多值字段?
1) 找到了多字段查询,如下:
multi_match()
1.3 安装Elastica
1)描述
Elastica是ElasticSearch的一个php客户端。它能在php对ES进行一些操作。接下来的进攻方向是用Elastic对ES进行二级检索。
2)安装composer
a.)运行下面命令更新依赖包:
sudo apt-get update
b.) 安装curl用下面命令:
sudo apt-get install curl php5-cli git
c.)下载安装Composer
curl -sS https://getcomposer.org/installer| sudo php -- --install-dir=
/app/web/api/v1/application/controllers/ES--filename=composer
curl -sS https://getcomposer.org/installer| sudo php -- --install-dir=
/app/web/api/v1/application/controllers/ES--filename=composer
php composer-setup.php --install-dir=bin--filename=composer
/app/server/php-5.5.7/bin/phpcomposer-setup.php --install-dir=/app/web/api/v1/application/controllers/ES--filename=composer
2)Elastica的安装
1.4 现在php报错
1)原因分析:
现在运行测试14服务器上,报错。如下:
root@localhostTest:/# php -v
PHP Warning: PHP Startup: Unable to load dynamic library'/usr/lib/php5/20121212/gd.so' - libjpeg.so.62: cannot open shared object file:No such file or directory in Unknown on line 0
PHP 5.5.9-1ubuntu4.21 (cli) (built:Feb 9 2017 20:54:58)
Copyright (c) 1997-2014 The PHP Group
Zend Engine v2.5.0, Copyright (c) 1998-2014Zend Technologies
with Zend OPcache v7.0.3, Copyright (c)1999-2014, by Zend Technologies
root@localhostTest:/#
注:可能是我更新依赖包时,报错了。
1.5 多值字段
我经常理解的二级字段(即:字段里面包含的字段),原字段称为多值字段。
这个多值查询是成功的-----------------------------------但主要研究的是content
curl -XPOST http://localhost:9200/dzplib/Problem/_search?pretty -d'
{"query":{
"multi_match": {
"query": "3",
"fields": [
"text",
"subQstNum"
]
}}
}'
匹配选项成功,因为都是ik分词,如下写即可:
curl -XPOST http://localhost:9200/dzplib/Problem/_search?pretty -d'
{"query":{
"multi_match": {
"query": "通过改变橡皮筋的长度来改变拉力做功的数值",
"fields": [
"text",
"content"
]
}}
}'
2017年3月27日星期一
-
ElasticSearch(七)高级排序(多级排序, 多值字段排序)
2020-08-17 16:44:31排序 为了按照相关性来排序,需要将相关性表示为一个数值。...1. 按照字段排序(评分机制取消) 只有字段排序会使评分机制取消. GET /_search { "query" : { "bool" : { "filter" : { "term" : { "use...排序
为了按照相关性来排序,需要将相关性表示为一个数值。在 Elasticsearch 中, 相关性得分 (_score)由一个浮点数进行表示,并在搜索结果中通过
_score
参数返回, 默认排序是_score
降序。注: filter不参与评分.
1. 按照字段排序(评分机制取消)
只有字段排序会使评分机制取消.
GET /_search { "query" : { "bool" : { "filter" : { "term" : { "user_id" : 1 }} } }, "sort": { "date": { "order": "desc" }} }
搜索结果如下:
"hits" : { "total" : 6, "max_score" : null, "hits" : [ { "_index" : "us", "_type" : "tweet", "_id" : "14", "_score" : null, "_source" : { "date": "2014-09-24", ... }, "sort" : [ 1411516800000 ] }, ... }
可以主要到的是_score为null了,代表评分机制取消, 结果只按照时间排序
2. 多字段组合排序(多级排序)
如果我们还是希望通过字段排序的同时, 也引入评分机制
例: 假定我们想要结合使用
date
和_score
进行查询,并且匹配的结果首先按照日期排序,然后按照相关性排序:GET /_search { "query" : { "bool" : { "must": { "match": { "tweet": "manage text search" }}, "filter" : { "term" : { "user_id" : 2 }} } }, "sort": [ { "date": { "order": "desc" }}, { "_score": { "order": "desc" }} ] }
Java代码如下:
// 排序条件 FieldSortBuilder ageSortBuilder = SortBuilders.fieldSort("date").order(SortOrder.ASC); // 默认score是倒序 ScoreSortBuilder scoreSortBuilder = new ScoreSortBuilder(); //组装条件 NativeSearchQuery searchQuery = new NativeSearchQueryBuilder() .withQuery(defaultQueryBuilder) .withHighlightBuilder(highlightBuilder) .withPageable(pageRequest) .withSort(ageSortBuilder) .withSort(scoreSortBuilder) .build();
排序条件的顺序是很重要的。结果首先按第一个条件排序,仅当结果集的第一个
sort
值完全相同时才会按照第二个条件进行排序,以此类推。多级排序并不一定包含
_score
。你可以根据一些不同的字段进行排序,如地理距离或是脚本计算的特定值。3.多值字段排序
如果是这个字段是集合类型例如 List<Date> dates, 那要怎么排序呢???
对于数字或日期,你可以将多值字段减为单值,这可以通过使用
min
、max
、avg
或是sum
排序模式 。 例如你可以按照每个date
字段中的最早日期进行排序,通过以下方法:"sort": { "dates": { "order": "asc", "mode": "min" } }
Java代码如下:
FieldSortBuilder dateSortBuilder = SortBuilders .fieldSort("dates") .order(SortOrder.ASC) .sortMode(SortMode.MIN);
-
Java操作Elasticsearch6实现单个字段多值匹配
2020-12-11 08:50:02单个字段多值匹配的意思类似mysql中某个字段的in查询,最近需求变更,需要在elasticsearch中实现多值匹配,下面总结一下几种实现的方法。 基础代码 下面是指定查询索引名称和索引类型基础代码: SearchRequest ...引言
单个字段多值匹配的意思类似mysql中某个字段的in查询,最近需求变更,需要在elasticsearch中实现多值匹配,下面总结一下几种实现的方法。
基础代码
下面是指定查询索引名称和索引类型基础代码:
SearchRequest searchRequest = new SearchRequest(); searchRequest.indices(indexName); searchRequest.types(indexType); SearchSourceBuilder builder = new SearchSourceBuilder(); BoolQueryBuilder boolQueryBuilder = new BoolQueryBuilder(); builder.query(boolQueryBuilder); searchRequest.source(builder); SearchResponse response = restHighLevelClient.search(searchRequest, RequestOptions.DEFAULT); //查询结果 SearchHits searchHits = response.getHits(); //查询结果条数 long total = searchHits.getTotalHits();
如果对上面的代码不太熟悉,可先参考之前的博客Java操作Elasticsearch6实现基本查询。
构造条件
下面以查询type字段为例,有0,1,2三种值,es中字段类型为long
方法一:QueryBuilders.termsQuery
//构造数组,初始化需要匹配的值 long[] typeArray = new long[]{0, 1}; boolQueryBuilder.filter(QueryBuilders.termsQuery("type", typeArray));
对应的sql语句为:
select * from table_name where type in (0,1);
需要注意的是这里使用的是termsQuery,而不是termQuery,使用termQuery查询会报错的。
方法二:must条件拼接,should查询多值
//构造类型查询条件 BoolQueryBuilder typeQueryBuilder = new BoolQueryBuilder(); //must连接其他条件,相当于and;should相当于or boolQueryBuilder.must(typeQueryBuilder.should(QueryBuilders.termQuery("type", 0)) .should(QueryBuilders.termQuery("type", 1)));
对应的sql语句为:
select * from table_name where type=1 or type =2;
方法三:mustNot反向匹配
boolQueryBuilder.mustNot(QueryBuilders.termQuery("type", 2))
要查询0和1的,只需要把2的过滤即可,可直接使用mustNot查询。
对应的sql语句为:
select * from table_name where type!=2;
而如果要查询等于2的,也可以采用多个不等条件,使用should连接
BoolQueryBuilder typeQueryBuilder = new BoolQueryBuilder(); boolQueryBuilder.mustNot(typeQueryBuilder.should(QueryBuilders.termQuery("type", 0)).should(QueryBuilders.termQuery("type", 1)));
对应的sql语句为:
select * from table_name where type!=0 and type!=1;
总结
本篇博客主要介绍了terms多值搜索,相当于mysql中的in语句。实际应用过程,就是对elasticsearch查询语法慢慢熟悉的最好的方式。
-
Elasticsearch 多字段值匹配
2018-03-31 11:19:00GET /data_stat_index/_search { "query":{ "bool":{ "must":[ ... 利用elasticsearch 查询多个字段的值: must 表示下面所有条件满足; match 匹配某字段, 是查询的是具有解析类型的字段;... -
Solr多值示例
2017-02-12 11:14:00Solr存储单个值字段和多个值字段的索引值的方式没有区别。 但是,虽然从存储中检索多值字段,我们将获得结果作为列表,需要解析以显示多个值。 为了演示多值特性,我们将使用Solr服务器附带的示例文件“books.json... -
Oracle-update同时更新多个字段多个值
2021-05-01 03:56:32--查询表CUX_TEST_TABLE_A ----查询表CUX_TEST_TABLE_B --做同时更新多个字段的update语句 UPDATE cux_test_table_a a SET (a.a2 ,a.a3) = (SELECT b.b2 ,b.b3 FROM cux_test_table_b b WHERE b.b1 = a.a1 AND a.a3... -
SQL一次查出多个字段的COUNT值
2021-01-20 02:53:53数据库 数据库SQL语句一字符和日期 --字符和日期都要包含在单引号中 --字符大小写敏感,日期格式敏感 --默认的日期格式是DD-MON-RR --查询当前系统时间 SQL> select sysdate from d ...global name &... -
Mysql查询某个字段多个值最新一条数据
2020-12-26 12:15:09电力实时数据表中,查询多个设备最后一次插入的数据 版本 SQL SELECT * FROM(SELECT id,deviceid,powertotal FROM t_electric_realtime where deviceid BETWEEN 30 and 39 ORDER BY id DESC LIMIT 10) a ... -
arcgis多个字段最小值、最大值、平均值计算
2020-12-16 15:35:10arcgis10.x多个字段最小值、最大值、平均值计算 好像没找到arcgis的多个字段最小值计算函数,虽然可以用excel统计,但是中间要转数据,比较麻烦。下面用python代码简洁实现计算多个字段的最小值(如下图,计算a,b两... -
MySQL – 两个或多个字段中的最大值
2021-01-26 05:54:14如果要获取所有行的绝对最大值,则可能需要使用以下内容:SELECT GREATEST(MAX(field1), MAX(field2));实施例1:SELECT GREATEST(1, 2);+----------------+| GREATEST(1, 2) |+---------------... -
mysql字段like多个值
2020-04-22 11:04:23比如需要这样的效果: SELECT project_name,pre_sale_number from estate_project_info WHERE loc_area='海淀区' AND (pre_sale_number like '%2016%' or pre_sale_number like '%2017%') 可以使用 REGEXP 写成: ... -
Java 根据字段名称获取字段值, 根据字段名称设置字段值
2021-01-13 10:43:46定义测试对象 public class User { private int age; private String name; private Date birthday; private boolean adult; public int getAge() { return age; } public void setAge(int age) { ... pub -
mysql 单个字段多个值
2019-12-17 15:44:42一个字段多个值,修改其中的一个 update 表名 set 字段名=replace(字段名,'原来的值','新值') 一个列有多个值,查询字段中是否包含某个值 select * from 表名 where find_in_set('admin',字段名) ... -
数据库设计中单个字段多值的处理
2013-11-07 09:39:31在数据库设计中,有一种情况是比较头痛的,就是一条业务数据有一个字段是多个值拼起来的,如一个设备有多个维护部门。 create table devcie ( devcie_id number, vindicate_dept_id varchar2(100) ); insert ... -
如何通过SQL按内容拆分字段(将一个字段值拆分两个字段)
2021-12-03 09:08:39SQL按内容拆分字段 -
搜索引擎solr系列---多字段匹配的实现方法
2017-10-31 13:11:20solr可以实现多字段匹配查询的结果,即传入一个条件,可以按照你预选设置好的匹配范围去匹配数据,将匹配到的所有数据返回。比如现在我有如下这样的需求: 数据库中fbf表中有多个字段,其中有几个中文字段,现在... -
MySQL 字段 LIKE 多个值
2019-12-24 11:12:13比如需要这样的效果: select * from user where name like '%四%' or name like '%五%' 可以使用 REGEXP 写成: select * from user where name regexp '四|五' References: ...... -
mysql更新多个字段语句写法!
2021-01-18 19:15:19mysql 数据库,更新字段语句:一、UPDATE:UPDATE的功能是更新表中的数据。这的语法和INSERT的第二种用法相似。必须提供表名以及SET表达式,在后面可以加WHERE以限制更新的记录范围。UPDATE table_anem SET column_... -
数据库一个表中的多个字段值修改SQL,update、replace
2021-01-31 17:18:56修改操作又称为更新操作,其语句一般格式为: UPDATE<表名> SET<列名>=<表达式>[,<列名>=<表达式>...现在对名称为田七的人,年龄置空,并将其班级修改为CLASS2: ..... -
从sql多个字段中取最小值或者最大值
2021-06-08 18:00:46Least()函数:从值列表(N1,N2,N3,等等)返回至小值项 SELECT LEAST(3,5,1,8,33,99,34,55,67,43) from dual 运行结果如图所示: 2. Greatest函数:从值列表(N1,N2,N3,等等)返回最大值项 SELECT greatest(3,5,1... -
使用sql同时更新多个字段的方法
2021-03-03 21:04:55使用sql同时更新多个字段的方法发布时间:2020-08-25 14:18:57来源:亿速云阅读:116作者:小新这篇文章将为大家详细讲解有关使用sql同时更新多个字段的方法,小编觉得挺实用的,因此分享给大家做个参考,希望大家... -
group by 多个字段值
2018-03-13 11:16:59首先,思考一个问题,GROUP BY X意思是将所有具有相同X字段值的记录放到一个分组里,即是以X字段进行分组;那么GROUP BY X, Y呢,同理,此意思是将所有具有 相同X和Y字段值的记录放到一个分组里,换言之,是以X和Y... -
mysql常用sql总结_获取多个字段最大值最小值
2020-07-23 19:27:38#以flyPlanId为学号,查询companyId,applyId,fssId 最大值 select flyPlanId,companyId,applyId,fssId from flyplan ; SELECT flyPlanId,GREATEST(companyId,applyId,fssId) from flyplan GROUP BY flyPlanId; -
java – 使用反射获取字段值
2021-02-27 21:03:19您仍然需要先设置该实例变量,否则它将没有任何值. 例如. Class clazz = Class.forName("com.something.Foobar"); Object object = clazz.newInstance(); 或者,它的构造函数中有两个参数,例如String和int …… Class ... -
MYSQL一个字段多个值拼接成一列函数group_concat
2019-09-24 17:12:01MYSQL一个字段多个值拼接成一列函数group_concat示例函数相关配置 示例 1.单列多行合并单行单列展示 select group_concat(name) as name from student where classId = 1 执行结果如下图: 2.多列拼接,多列多行值... -
SQL 拼接多个字段的值&一个字段多条记录的拼接
2019-06-05 10:00:53例如:test表 一、拼接多个字段的值 select Convert(nvarchar(50),id)+'-'+name+'-'+...二、一个字段多条记录的拼接 select stuff((select '-'+name from test for xml path ('')),1,1,'') as montage 结果: ... -
mysql 一个字段多值同时匹配 group by having
2020-04-25 13:45:12在关联表中,有字段a和字段b,需要查找满足字段a多个值匹配时,字段b的集合 前提描述 t_restaurant_feature餐厅特性中,一个餐厅可包含多个特性 字段名 说明 id 记录id restaurant_id 餐厅id feature_id...