从Lucene到Elasticsearch-读书笔记

检索模型

  • 布尔检索模型
    布尔检索法是指利用布尔运算符连接各个检索词,然后由计算机进行逻辑运算,找出所需信息的一种检索方法。
    布尔检索模型中主要有AND、OR、NOT三种逻辑运算,布尔逻辑运算符的作用是把检索词连接起来,构成一个逻辑检索式。
  • tf-idf中文称为词频-逆文档频率
    用以计算词项对于一个文档集或一个语料库中的一份文件的重要程度。
    举个例子,一篇3000字的文章中词语“足球”出现了3次,我们很难断定这篇文章就是和足球相关的,但是一篇140字的微博中同样出现三次“足球”,基本可以断定微博内容和足球有关。
  • 分词器
	public static void printAnalyzer(Analyzer analyzer) throws IOException {
		StringReader reader = new StringReader(str);
		TokenStream toStream = analyzer.tokenStream(str, reader);
		toStream.reset();// 清空流
		CharTermAttribute teAttribute = toStream.getAttribute(CharTermAttribute.class);
		while (toStream.incrementToken()) {
			System.out.print(teAttribute.toString() + "|");
		}
		System.out.println("
");
		analyzer.close();
	}

Analyzer analyzer = new StandardAnalyzer();

标准分词:class org.apache.lucene.analysis.standard.StandardAnalyzer
中|华|人|民|共|和|国|简|称|中|国|是|一|个|有|13|亿|人|口|的|国|家|

空格分词:class org.apache.lucene.analysis.core.WhitespaceAnalyzer
中华人民共和国简称中国,|是一个有13亿人口的国家|

简单分词:class org.apache.lucene.analysis.core.SimpleAnalyzer
中华人民共和国简称中国|是一个有|亿人口的国家|

二分法分词:class org.apache.lucene.analysis.cjk.CJKAnalyzer
中华|华人|人民|民共|共和|和国|国简|简称|称中|中国|是一|一个|个有|13|亿人|人口|口的|的国|国家|

关键字分词:class org.apache.lucene.analysis.core.KeywordAnalyzer
中华人民共和国简称中国, 是一个有13亿人口的国家|

elasticsearch基本操作

设置分片数和副本数

put blog 
{
  "settings":{
    "number_of_shards":30,
    "number_of_replicas":10
  }
}

禁止对索引进行写操作

put blog2/_settings
{
  "blocks.write":true
}

查询所有的索引信息

get _all/_settings

关闭和打开索引

关闭索引后, 不能再对索引进行读写. 都会报错.
索引数据会持久化到磁盘, 不再占用内存资源(一个关闭了的索引几乎不占用系统资源)

post blog2/_close
post blog2/_open

_reindex API可以把文档从一个索引(源索引)复制到另一个索引(目标索引),目标索引不会复制源索引中的配置信息,_reindex操作之前需要设置目标索引的分片数、副本数等信息。

复制索引

post _reindex
{
  "source":{"index":"blog2"},
  "dest":{"index":"blog3"}
}

索引别名

post /_aliases
{
  "actions":[
    { 
      "add":{"index":"test1","alias":"alias1"}
    }]
}

带版本号更新

put /w/blog/1?version=50&version_type=external
{"tiele":"a",
  "text":"b"
}

根据版本号查询

get /w/blog/1?version=50

  • 假设存在一个有50个分片的索引,在集群上执行一次查询的过程如下:
    (1)查询请求首先被集群中的一个节点接收。
    (2)接收到这个请求的节点,将这个查询广播到这个索引的每个分片上。
    (3)每个分片执行完搜索查询并返回结果。
    (4)结果在通道节点上合并、排序并返回给用户。

避免向所有分片发出请求

put /w/blog/1?routing=user123
{
  "title":"a",
  "text":"b"
}

get /w/blog/1?routing=user123

强制类型,不允许额外的字段

"dynamic":"strict"

put /b
{
  "mappings":{
    
      "dynamic":"strict",
      "properties":{
        "title":{
          "type":"text"
        },
        "publish_date":{
          "type":"date"
        }
      
    }
  }
}

字段类型

text

如果一个字段是要被全文搜索的,比如邮件内容、产品描述、新闻内容,应该使用text类型。
设置text类型以后,字段内容会被分析,在生成倒排索引以前,字符串会被分词器分成一个一个词项。
text类型的字段不用于排序,很少用于聚合(termsAggregation除外)

put my_index
{
  "mappings":{
    "properties":{
      "full_name":{
        "type":"text"
      }
    }
  }
}

keyword

keyword类型适用于索引结构化的字段,比如email地址、主机名、状态码和标签,
通常用于过滤(比如查找已发布博客中status属性为published的文章)、排序、聚合。
类型为keyword的字段只能通过精确值搜索到,区别于text类型。

数字类型

日期类型

put my_index3
{
  "mappings":{
    "properties":{
      "date":{
        "type":"date"
      }
    }
  }
}

put /my_index3/_doc/1
{
"date":"2015-01-01"
  
}

Boolean类型

put my_index4
{
  "mappings":{
    "properties":{
      "is_published":{
        "type":"boolean"
      }
    }
  }
}

put /my_index4/_doc/1
{
"is_published":true
  
}

数组

在文档中使用array类型不需要提前做任何配置,默认支持

put /my_index4/_doc/1
{
 "list":[
   {"name":"a","description":"b"},
   {"name":"c","description":"d"}
   ]
  
}

搜索数组中的内容

get /my_index4/_search
{
  "query":{
    "match":{"list.name":"a"}
  }
}

object

写入到Elasticsearch之后,文档会被索引成简单的扁平key-value对
eg:


put /my_index/my_type/1
{
  "region":"us",
  "manager":{
    "age":30,
    "name":{
      "first":"John",
      "last":"Smith"
    }
  }
}

elasticsearch搜索

导入数据,先上传文件到服务器,然后执行命令

curl -H "Content-Type: application/json" -XPOST "192.168.56.111:9200/how2java1/_bulk?refresh" --data-binary "@accounts.json"

  • term query
    trem query查的是词项,如果查询语句没有匹配到词项,则会返回空
这里如果tiile查询Java会返回空,即使数据库中有记录, 因为没有匹配到词项
get /books/_search
{
  "query":{
    "term":{"title":"程"}
  }
}
  • match query:
    会对查询语句进行分词,分词后查询语句中的任何一个词项被匹配,文档就会被搜索到。如果想查询匹配所有关键词的文档,可以用and操作符连接

  • match_phrase query
    match_phrase query首先会把query内容分词,分词器可以自定义,同时文档还要满足以下两个条件才会被搜索到:
    (1)分词后所有词项都要出现在该字段中。
    (2)字段中的词项顺序要一致。


只有前两个文档会被识别


  • multi_match query
    多字段查询
get /books/_search
{
  "query":{
    "multi_match": {
      "query": "名著",
      "fields": ["title","description"]
    }
  }
}
  • terms query
get books/_search
{"query":{
  "terms":{
    "title":["java","python"]
  }
}}
  • range query
    使用range查询只能查询一个字段,不能作用在多个字段上
    ● gt 大于,查询范围的最小值,也就是下界,但是不包含临界值。
    ● gte 大于等于,和gt的区别在于包含临界值。
    ● lt 小于,查询范围的最大值,也就是上界,但是不包含临界值。
    ● lte 小于等于,和lt的区别在于包含临界值。
get books/_search
{"query":{
  "range":{
    "price":{
      "gt":50,
      "lte":70
    }
  }
}
}

时间范围查询

get books/_search
{"query":{
  "range":{
    "publish_time":{
      "gt":"2016-01-01",
      "lte":"2016-12-31",
      "format":"yyyy-MM-dd"
    }
  }
}
}
  • prefix query 前缀查询
get books/_search
{"query":{
  "prefix": {
    "description": {
      "value": "你"
    }
  }
}}
  • wildcard query
    模糊查询
get books/_search
{"query":{
  "wildcard": {
    "title": "j*"
  }
}}
  • bool query
    bool查询可以把任意多个简单查询组合在一起,使用must、should、must_not、filter选项来表示简单查询之间的逻辑,每个选项都可以出现0次到多次,它们的含义如下:
    ● must文档必须匹配must选项下的查询条件,相当于逻辑运算的AND。
    ● should文档可以匹配should选项下的查询条件也可以不匹配,相当于逻辑运算的OR。
    ● must_not与must相反,匹配该选项下的查询条件的文档不会被返回。
    ● filter和must一样,匹配filter选项下的查询条件的文档才会被返回,但是filter不评分,只起到过滤功能。
  • constant_score query
    constant_score query可以包装一个其他类型的查询,并返回匹配过滤器中的查询条件且具有相同评分的文档
get books/_search
{"query":{
  "constant_score": {
    "filter": {"term":{"title":"java"}},
    "boost": 1.2
  }
}}
  • 搜索高亮
get /books/_search
{"query":{
  "match":{"title":"javascript"}
},
  "highlight":{
    "fields": {
      "title":{
        "pre_tags": ["<strong>"],
        "post_tags": ["</strong>"]
      }
    }
  }
}
  • 排序
get books/_search
{"size":2,
  "query":{
    "match_all": {}
  },
  "sort":[{"_doc":{"order":"asc"}}]
}
  • 最大值统计
get books/_search
{"size":1,
   "aggs":{
     "max_price":{
       "max":{"field":"price"}
     }
     
   }
}
  • 最小值
get books/_search
{"size":1,
   "aggs":{
     "aaa":{
       "min":{"field":"publish_time"}
     }
     
   }
}
  • 平均值
get books/_search
{"size":0,
   "aggs":{
     "aaa":{
       "avg":{"field":"price"}
     }
     
   }
}
  • 一次把几个聚合值算出来
get books/_search
{"size":0,
   "aggs":{
     "aaa":{
       "stats":{"field":"price"}
     }
     
   }
}
``
`
原文地址:https://www.cnblogs.com/Baronboy/p/15350718.html