文章目录
2.Search
URI Search详解
正排索引与倒排索引:
倒排索引包含两部分:
- 单词词典,记录所有文档的单词,记录单词到倒排列表的关联关系
单词词典一般比较大,可以通过B+树或哈希拉链法实现,以满足高性能的插入与查询。 - 倒排列表,记录了单词对应的文档集合,由倒排索引项组成。倒排索引项:
文档ID
词频TF:该单词在文档中出现的次数,用于相关性评分
位置(Position):单词在文档中分词的位置。用于语句搜索
偏移(Offset):记录单词的开始与结束位置,实现高亮显示
例如:ElasticSearch对应的倒排索引
ES的JSON文档中的每个字段,都有自己的倒排索引,可以指定对某些字段不做索引。优点:节省存储空间;缺点:字段无法被搜索
Analyzer分词
Analysis与Analyzer
Analysis——文本分析是把全文本转换成一系列单词(term/token)的过程,也叫分词。
Analysis是通过Analyzer(分词器)实现的,可以使用ES内置的分词器或按需定制分词器。
除了在数据写入时转换词条,匹配Query语句时也需要用相同的分词器对查询语句进行分析。
Analyzer 由三部分组成
• Character Filters:原始文本处理,如去除 html
• Tokenizer:按照规则切分为单词
• Token Filters:对切分单词加工、小写、删除 stopwords,增加同义词
ES内置的分词器:
使用_analyzer API
可以通过三种方式查看Analyzer是如何进行工作的:
- 直接指定Analyzer进行测试
- 指定索引的字段进行测试
- 自定义分词进行测试
多种分词器
- Standard Analyzer
默认分词器
按词切分
小写处理
stopwords是默认关闭的 - Simple Analyzer
按照非字母切分,非字母的都被去除
小写处理 - Whitespace Analyzer
按照空格切分 - Stop Analyzer
相比Simple Analyzer,多了stop filters,即会把the、a、is等修饰性词语去掉 - Keyword Analyzer
不分词,直接将输入当一个term输出 - Pattern Analyzer
通过正则表达式进行分词
默认是\W+,非字符的符号进行分隔 - Language Analyzer
可以指定语言来处理不同语言的输入
中文分词
切分成词,而不是字
英文中单词有自然的空格作为分隔
中文在不同的上下文中有不同的理解
ICU Analyzer
需要安装plugin:Elasticsearch-plugin install analysis-icu
提供了Unicode的支持,更好的支持亚洲语言
更多中文分词器
- IK
支持自定义词库,支持热更新分词字典 - THULAC
清华大学推出的一款中文分词器
Search API概览
Search API
- URI Search
在URL中使用查询参数 - Request Body Search
使用ES提供的,基于JSON格式的更加完备的Query Domain Specific Language(DSL)
指定查询的索引:
URI查询
Request Body
Response
衡量相关性
- Precision(查准率):尽可能返回较少的无关文档
- Recall(查全率):尽量返回较多的相关文档
- Ranking:是否能够按相关度进行排序?
ES提供了很多查询相关的参数来改善搜索的 Precision和Recall。
URI Search详解
- 指定字段 vs. 泛查询
q=title:2012 / q=2012 - Term v.s Phrase
Beautiful Mind 等效于Beautiful OR Mind
“Beautiful Mind”,等效于Beautiful AND Mind。Phrase查询,还要求前后顺序保持一致 - 分组与引号
title:(Beautiful AND Mind)
title=“Beautiful Mind” - 布尔操作
AND / OR / NOT 或者 && / || /!
必须大写
title:(matrix NOT reloaded) - 分组
+表示must
-表示must_not
title:(+matrix-reloaded) - 范围查询
区间表示:[]闭区间,{}开区间
year:{2019 TO 2018}
year:[* TO 2018] - 算数符号
year:>2010
year:(>2010 && <=2018)
year:(+>2010 +<=2018) - 通配符查询(效率低,占用内存大,不建议使用。特别是放在最前面)
?代表1个字符,*代表0或多个字符
title:mi?d
title:be* - 正则表达
title:[bt]oy - 模糊匹配与近似查询
title:befutifl~1
title:“lord rings”~2
Request Body与Query DSL简介
在ES中,一些高阶的使用方法只能在Request Body Search中去做
- 分页:
from从0开始,默认返回10个结果 - 排序:
最好在“数字型”与“日期型”字段上排序
“sort”:[{“order_date”:“desc”}] - _source filtering
“_source”:[“order_date”]
如果_source没有存储,那就只返回匹配的文档的元数据
_source支持使用通配符 - 脚本字段
用例:比如订单中有不同的汇率,需要结合汇率,对订单价格进行排序 - 查询表达式-Match
Last与Christmas间默认是OR关系
- 短语搜索-Match Phrase
这些词必须按顺序出现,并且各词中间可以有一个其他字符进入(间隔)
Query String&Simple Query String查询
Query String Query:
Simple Query String:
- 类似Query String,但是会忽略错误的语法,同时只支持部分查询语法
- 不支持AND OR NOT,会当作字符串处理
- Term间默认关系是OR,可以指定Operator
- 支持部分逻辑:+代替AND,|代替OR,-代替NOT