ES中put 新增 post 修改
Kibana开发工具,用来往ES引擎中对文档进行操作和生成文档的对应索引的
ik_max_word最细密度的拆分文本,会穷尽各种组合,适用于Term Query
ik_smart最粗密度的拆分文本,适合Phrase查询
文档经过ik分词器生成倒排索引 (字符串两种text类型分词,keyword不分词(barcode条码))
ik分词器有自己的词典存有百万计的中文词,分出的词段与字典匹配,字典有就保留
索引(是具有实现关键词-文档矩阵的具体数据结构的数据)(里面存储着各种具体储存类型的索引)
索引可进行分片存储在多个服务器上,提高效率,分片可以行成副本,以防止服务器宕机导致搜索数据不全,副本可以是n个,是根据服务器的多少,和自身需求来定(一般就两三个 ),一个分片的副本在其他服务器上每个只有一份
put创建索引,实质put请求http ,其实索引生成器有两步操作,其实put(新增)请求上面的路径是在往url里添加文档原始数据,put/products/Id这个id就是这个文档id, 还有索引生成器对提交的文档创建相应的索引,索引id就是文档id
索引库:储存搜索引擎抓取到的相应的资源(文档等) 还有索引
正向索引: 当用户发起查询时(假设查询为一个关键词),搜索引擎会扫描索引库中的所有文档,找出所有包含关键词的文档,这样依次从文档中去查找是否含有关键词的方法叫做正向索引。
正向索引数据的数据结构:文档id->关键词
倒排索引(反向索引 )(Inverted Index): 倒排索引数据的数据结构是 关键词->文档或者网页id的矩阵的具体数据结构,是关键词-文档矩阵的具体存储结构之一
倒排索引由"词典"和倒排文件组成,根据词典中的关键词获取相应的倒排列表
词典(Lexicon): 搜索引擎的通常索引单位是单词,单词词典是由文档集合中出现过的所有单词构成的字符串集合,单词词典内每条索引项记载单词本身的一些信息以及指向“倒排列表”的指针。(存在于内存中)
倒排列表(PostingList):倒排列表记载了出现过某个单词的所有文档的文档列表及单词在该文档中出现的位置信息,每条记录称为一个倒排项(Posting)。根据倒排列表,即可获知哪些文档包含某个单词。
倒排文件(Inverted File):所有单词的倒排列表往往顺序地存储在磁盘的某个文件里,这个文件即被称之为倒排文件,倒排文件是存储倒排索引的物理文件。
倒排列表中除了存储文档Id外还有TF(term frequency): 单词在文档中出现的次数。Pos: 单词在文档中出现的位置。(倒排列表(DocID;TF;
文档(document):一般搜索引擎的处理对象是互联网网页,而文档这个概念要更宽泛些,代表以文本形式存在的存储对象,相比网页来说,涵盖更多种形式,比如Word,PDF,html,XML等不同格式的文件都可以称之为文档。
文档集合(document Collection):由若干文档构成的集合称之为文档集合。比如海量的互联网网页或者说大量的电子邮件都是文档集合的具体例子。
文档编号(document ID(Doc ID)):在搜索引擎内部,会将文档集合内每个文档赋予一个唯一的内部编号,以此编号来作为这个文档的唯一标识,这样方便内部处理,每个文档的内部编号即称之为“文档编号”,后文有时会用DocID来便捷地代表文档编号。es中文档编号就是文档创建对应的索引编号,
单词编号(Word ID):与文档编号类似,搜索引擎内部以唯一的编号来表征某个单词,单词编号可以作为某个单词的唯一表征。
词条:一段文本中有效词的子序列,其中每个子序列称为一个词条。(文本词条化,去掉停用词)(就是关键词)
词条类:相同词条构成的集合。
词项:一个词项指的是在信息检索系统词典中所包含的某个可能经过归一化处理的词条类。(词项集合和词条集合可以完全不同,比如可以采用某一个分类体系中的类别标签作为词项。当然,在实际的信息检索系统中,词项往往和词条密切相关)
停用词(stop word): 某些情况下,一些常见词在文档和用户需求进行匹配时价值并不大,需要彻底从词汇表中去除。这些词称为停用词(stop word).
去掉停用词: 一个常用的生成停用词表的方法就是将词项按照文档集频率(collection frequency,每个词项在文档集中出现的频率)从高到低排列,然后手工选择那些语义内容与文档主题关系不大的高频词作为停用词。停用词表中的每个词将在索引过程中被忽略.
中文和英文等语言不同,单词之间没有明确分隔符号,所以首先要用分词系统将文档自动切分成单词序列。这样每个文档就转换为由单词序列构成的数据流,为了系统后续处理方便,需要对每个不同的单词赋予唯一的单词编号,同时记录下哪些文档包含这个单词,在如此处理结束后,我们可以得到最简单的倒排索引.
修改文档
底层的索引数据无法修改,修改数据实际上是删除在重新添加
put: 对文档进行完整的替换
post: 可以修改一部分字段这两种方法实质上还是先删除在添加
删除文档
redis 加速 mongodb 加速 算法关系 运算 es 搜索
在创建索引工具查看上生成的索引 第一个看不到分词器生成的关键词
后面的三个是能查看fields后面对应的数据被分词器生成的关键词
在post后面的路径搜索相关的关键词 query中是搜索参数 match_all全部后面不加参数,match加参数就是指定的数据 size 是返回显示的数据参数个数:如果不设置默认返回十个
bool是判断,must是与,should是或,match是搜索参数(可以是具体关键词,也可以是数量)
filter是过滤,range代表价格过滤类别
关键词高亮处理
fields [选择查找关键词的字段] highlight是高亮设置 pre_tags是关键词的标签前部分
post_tags是后部分fields是指定关键词做高亮的字段
..
Spring Data Elasticsearch
添加依赖elasticsearch
ngram分词器分词原理如图
这段是ngram分词器的官方配置
Repository API
package cn.tedu.es;
import cn.tedu.es.entity.Student;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.Pageable;
import org.springframework.data.elasticsearch.repository.ElasticsearchRepository;
import java.util.List;
public interface StudentRepository//泛型里的参数是,操作的数据的类型和索引id类型
extends ElasticsearchRepository {
// 在 name 中搜索关键词
Page findByName(String nameKey, Pageable pageable);
// 在 name 和 birthDate 中搜索
List findByNameOrBirthDate(String name, String birthDate);
}
配置文件--日志
logging:
level:
# 显示 rest api 通信的 http 协议数据
tracer: trace
package cn.tedu.es.entity;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import org.springframework.data.annotation.Id;
import org.springframework.data.elasticsearch.annotations.document;
import org.springframework.data.elasticsearch.annotations.Field;
@document(indexName = "students",shards = 3,replicas = 2)
@Data
@NoArgsConstructor
@AllArgsConstructor
public class Student {
@Id // 使用学生学号,作为索引id(_id) 不加随机产生
private Long id;
private String name;
private Character gender;
// 设置索引中的字段名,对应实体类中的属性
// 字段名和属性名相同,可以省略
@Field("birthDate")
private String birthDate;
}
Criteria API
Criteria
Criteria --封装搜索条件 CriteriaQuery --封装了Criteria
SearchOperation --执行上面的Query请求工具
package cn.tedu.es;
import cn.tedu.es.entity.Student;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.elasticsearch.core.ElasticsearchOperations;
import org.springframework.data.elasticsearch.core.SearchHit;
import org.springframework.data.elasticsearch.core.SearchHits;
import org.springframework.data.elasticsearch.core.query.Criteria;
import org.springframework.data.elasticsearch.core.query.CriteriaQuery;
import org.springframework.stereotype.Component;
import java.util.ArrayList;
import java.util.List;
import java.util.stream.Collectors;
@Component
public class StudentSearcher {
// 用来执行 CriteriaQuery 的工具对象
@Autowired
private ElasticsearchOperations o;
// 任意定义的搜索方法
public List findByName(String nameKey) {
Criteria c = new Criteria("name"); //字段
c.is(nameKey); //关键词
return exec(c);
}
public List findByBirthDate(String from, String to) { //from to是一个数值到另一个数值
Criteria c = new Criteria("birthDate");
c.between(from, to);
return exec(c);
}
private List exec(Criteria c) {
// 把条件,封装到一个查询对象
CriteriaQuery q = new CriteriaQuery(c);
// SearchHits[SearchHit, SearchHit, SearchHit]
SearchHits shs = o.search(q, Student.class);
// List list = new ArrayList<>();
// for (SearchHit sh : shs) {
// Student s = sh.getContent();
// list.add(s);
// }
// 可以使用集合的 stream api 和 lambda 语法,简化上面的代码
List list =
shs.stream()
.map(SearchHit::getContent)
.collect(Collectors.toList());
return list;
}
}
Spring Data ES分页
Pageable --是封装向服务器提交的分页参数 (页号 和 页里的数据段数目) Page --(可选配置)封装从服务器中返回的搜索结果的一页数据,和分页属性数据(分页属性数据包括number(当前页的页号) hasPrevious(是否有上页) hasNext(是否右下一页) rows数据行数 maxPage最大页页号)
词条归一化(token normalization): 就是将看起来不完全一致的多个词条归纳成一个等价类,以便在它们之间进行匹配的过程.
隐式地建立等价类,每类可以用其中的某个元素来命名。比如,在文档和查询中,都把词条anti-discriminatory和antidiscriminatory映射成词项antidiscriminatory,这样对两个词中的任一个进行搜索,都会返回包含其中任一词的文档。这种处理方法的优点在于:一方面,等价类的建立过程是隐式的,不需要事先计算出等价类的全部元素,在映射规则下输出相同结果的词项一起构成等价类集合;另一方面,仅仅构建“去除字符”这种映射规则也比较容易.
显示建立等价类,维护多个非归一化词条之间的关联关系。该方法可以进一步扩展成同义词词表的手工构建,比如将car和automobile归成同义词。这些词项之间的关系可以通过两种方式来实现。第一种常用的方式是采用非归一化的词条进行索引,并为某个查询词项维护一张由多个词组成的查询扩展词表。当输入一个查询词项时,则根据扩展词表进行扩展并将扩展后得到的多个词所对应的倒排记录表合在一块(如下图一)。另一种方式是在索引构建时就对词进行扩展(如下图二)。比如,对于包含automobile的文档,我们同时也用car来索引(同样,包含car的文档也用automobile来索引).
文档频率信息”代表了在文档集合中有多少个文档包含某个单词,之所以要记录这个信息,其原因与单词频率信息一样,这个信息在搜索结果排序计算中是非常重要的一个因子.



