精华内容
下载资源
问答
  • 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` 字段进行强制排序会消耗大量内存。 >详情请查阅《字段类型简介》相关内容。

    更多相关内容
  • 关键词:索引多值字段检索,多值字段,匹配选项成功 一、索引多值字段检索 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

    2Elastica的安装

    http://elastica.io/

    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日星期一

    展开全文
  • 排序 为了按照相关性来排序,需要将相关性表示为一个数值。...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);
    

     

    展开全文
  • 单个字段多值匹配的意思类似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:00
    GET /data_stat_index/_search { "query":{ "bool":{ "must":[ ... 利用elasticsearch 查询字段: must 表示下面所有条件满足; match 匹配某字段, 是查询的是具有解析类型的字段;...
  • Solr多值示例

    千次阅读 2017-02-12 11:14:00
    Solr存储单个值字段值字段的索引值的方式没有区别。 但是,虽然从存储中检索多值字段,我们将获得结果作为列表,需要解析以显示个值。 为了演示值特性,我们将使用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 &...
  • 电力实时数据表中,查询个设备最后一次插入的数据 版本 SQL SELECT * FROM(SELECT id,deviceid,powertotal FROM t_electric_realtime where deviceid BETWEEN 30 and 39 ORDER BY id DESC LIMIT 10) a ...
  • arcgis10.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 写成: ...
  • 定义测试对象 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按内容拆分字段
  • solr可以实现多字段匹配查询的结果,即传入一个条件,可以按照你预选设置好的匹配范围去匹配数据,将匹配到的所有数据返回。比如现在我有如下这样的需求:  数据库中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:19
    mysql 数据库,更新字段语句:一、UPDATE:UPDATE的功能是更新表中的数据。这的语法和INSERT的第二种用法相似。必须提供表名以及SET表达式,在后面可以加WHERE以限制更新的记录范围。UPDATE table_anem SET column_...
  • 修改操作又称为更新操作,其语句一般格式为: UPDATE<表名> SET<列名>=<表达式>[,<列名>=<表达式>...现在对名称为田七的人,年龄置空,并将其班级修改为CLASS2: .....
  • Least()函数:从列表(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...
  • #以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示例函数相关配置 示例 1.单列多行合并单行单列展示 select group_concat(name) as name from student where classId = 1 执行结果如下图: 2.多列拼接,多列多行...
  • 例如:test表 一、拼接多个字段的 select Convert(nvarchar(50),id)+'-'+name+'-'+...二、一个字段多条记录的拼接 select stuff((select '-'+name from test for xml path ('')),1,1,'') as montage 结果: ...
  • 在关联表中,有字段a和字段b,需要查找满足字段a匹配时,字段b的集合 前提描述 t_restaurant_feature餐厅特性中,一个餐厅可包含个特性 字段名 说明 id 记录id restaurant_id 餐厅id feature_id...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 1,847,165
精华内容 738,866
关键字:

多值字段

友情链接: coderekursivejava.rar