ElasticSearch+Solr几个案例笔记

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

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

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

(2)分词+索引通常不会出现长度越界问题oop

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

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

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

如何设置?搜索引擎

(1)在ES中code

"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里面的字段并给予其认为可能的字段类型token

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

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

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

如何解决:

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

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

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

举个例子:

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

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

content:Syntax err*

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

content:Syntax
default_field:err*

因此就查不到数据了,如何解决?

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

content:Syntax\\ err*

有什么问题能够扫码关注微信公众号:我是攻城师(woshigcs),在后台留言咨询。 技术债不能欠,健康债更不能欠, 求道之路,与君同行。

输入图片说明

相关文章
相关标签/搜索