ElasticSearch+Solr几个case笔记

(一) 最大能索引字符串的长度

关于能索引最大的字符串长度,其实在Elasticsearch和Solr中都是由底层的Lucene决定的

(1)不分词+索引的字符串最大长度为32766字节

(2)分词+索引一般不会出现长度越界问题

(3)不索引的字符串虽然没有长度最大限制,但是不建议使用搜索引擎存储大量文本

(二)设置超出一定长度的字段,不索引

其实这个功能,也是由底层Lucene提供的,关于它的应用场景举个例子,大部分情况下,不分词的字段可能经常会被用来聚合,过滤,排序,分组,但是如果这个不分词的字段非常长,通常情况下是没有意义的,比如标题,小于40个字的,我们索引它,让它参与聚合,过滤,排序等,但如果大于40,我们则认为它不需要索引,从而节省索引的体积大小,来提高搜索性能。

如何设置?

(1)在ES中

"message": {          "ignore_above": 20, //超过20个字节,不索引该字段,注意对其他字段没有影响
          "index": "not_analyzed",          "type": "string"
        }

(2)在Solr中

<fieldType name="limit_len" class="solr.TextField">
    <analyzer>
      <tokenizer class="solr.KeywordTokenizerFactory"/>      //超过10个字节,就丢弃该字段,同样对其他字段没有影响
      <filter class="solr.LengthFilterFactory" min="0" max="10"/>
    </analyzer>
  </fieldType>

(三)ElasticSearch中动态mapping的三种校验模式

在ES中,一个mapping下面可以有多个type,每个type相当于一个表,type的检验模式有三种

//默认模式,开启动态模式,允许任何字段添加到该表中(1)"dynamic": true //关闭动态模式,不在定义的scheam中的字段,会自动忽略,不会报错(2)"dynamic": false//严格模式,不在定义的scheam中的字段,会拒绝索引,抛出异常(3)"dynamic": "strict"

注意type的schema是有校验模式的,但是每个mapping里面的type却是动态的,添加一个不存在的type并不会报错,es会自动识别它的schema里面的字段并给予其认为可能的字段类型

(四)ElasticSearch中queryString语法的一个小坑

ElasticSearch里面索引一个不分词的字段时候,如果不给设置自动转小写的filter,那么他就是数据本身,但是查询的时候,默认情况下es会给转成小写查。

举个例子: 索引name=Hadoop进入es索引,然后使用name=Hadoop查,你会发现使用querySting语法查不到,因为es自动把Hadoop转成了hadoop去查,这样以来肯定查不到,有点小坑,这个问题在Solr中是不存在的。

如何解决:

//更改es默认转小写的bool值为falseQueryBuilders.queryStringQuery("name:Hadoop").lowercaseExpandedTerms(false)

(五)ElasticSearch+Solr使用queryString语法的注意事项

lucene的默认的queryString语法,如果一个关键词里面带有空格,它会自动拆分成两个关键词进行检索,但有时我们就是查询带空格的关键词,应该怎么办呢?

举个例子:

不分词+索引字段content=Syntax error 进入es,solr或者lucene中

假如我想使用前缀模糊查询:

content:Syntax err*

上面的语法是查不到任何内容的,但是明明有这条数据,为什么查不到?就是因为lucene默认会把空格当做多个关键词分界线,这样以来查询就转化成了:

content:Syntaxdefault_field:err*

所以就查不到数据了,如何解决?

非常简单,转义这个空格即可,注意只能转义空格,不能对整个查询字符串进行转义:

content:Syntax\\ err*

本文分享自微信公众号 - 我是攻城师(woshigcs)

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2016-09-22

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏Greenplum

Greenplum 对JSON的支持

源文章:http://www.postgresqltutorial.com/postgresql-json/

9710
来自专栏IMWeb前端团队

bash 的条件和循环

本文作者:IMWeb 江源 原文出处:IMWeb社区 未经同意,禁止转载 原文 条件语句和循环可以统称为流程控制,是一门语言最基础的部分。 bash ...

19660
来自专栏Albert陈凯

2018-10-24 Oracle中insert into select和select into的用法

在Oracle中select into from不可以使用-----原因很简单:select into是PL/SQL language 的赋值语句!如果使用则O...

10310
来自专栏Java帮帮-微信公众号-技术文章全总结

第二十九天-加强1-Junit&类加载&反射&Properties&BeanUtils&xml&动态代理&数据库【悟空教程】

第二十九天-加强1-Junit&类加载&反射&Properties&BeanUtils&xml&动态代理&数据库【悟空教程】

24870
来自专栏chenssy

【死磕Sharding-jdbc】---结果合并

接下来以执行 SELECT o.*FROM t_order o whereo.user_id=10order byo.order_id desc limit 2...

13630
来自专栏Ryan Miao

mysql插入日期 vs oracle插入日期

今天做oracle日期插入的时候突然开始疑惑日期是如何插入的。 用框架久了,反而不自己做简单的工作了。比如插入。 通常,新建一个表对象,然后绑定数据,前端for...

32490
来自专栏Golang语言社区

go语言的sql包原理与用法分析

go的sql包是在pkg/database中,里面的两个包sql和sql/driver可以一起看。建议看这个两个包之前可以先看看sql文件夹下的doc.txt。...

31040
来自专栏xingoo, 一个梦想做发明家的程序员

AngularJS API之toJson 对象转为JSON

toJson()能把对象序列化为json 方法讲解 这个方法最多支持2个参数: angular.toJson(obj, pretty); obj 是想要转换的...

26550
来自专栏吴伟祥

字段规范 原

6610
来自专栏数据结构与算法

SPOJ1043 GSS1(线段树)

注意查询的时候不能按照以前的方式写,因为不知道变量的下界,最稳妥的办法就是判三种情况

11110

扫码关注云+社区

领取腾讯云代金券