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*
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法