全文检索
分词
将文本转换为单词的过程,称为分词
例如 Good Day
分词后good
day
分词器
分词的技术实现
倒排索引
由词到文档
例如有以下下文档
DocId | Doc |
---|---|
1 | 谷歌地图之父跳槽 Facebook |
2 | 谷歌地图之父加盟 Facebook |
3 | 谷歌地图创始人拉斯离开谷歌加盟 Facebook |
4 | 谷歌地图之父跳槽 Facebook 与 Wave 项目取消有关 |
5 | 谷歌地图之父拉斯加盟社交网站 Facebook |
倒排后
WordId | Word | DocIds |
---|---|---|
1 | 谷歌 | 1, 2, 3, 4, 5 |
2 | 地图 | 1, 2, 3, 4, 5 |
3 | 之父 | 1, 2, 4, 5 |
4 | 跳槽 | 1, 4 |
5 | 1, 2, 3, 4, 5 | |
6 | 加盟 | 2, 3, 5 |
7 | 创始人 | 3 |
8 | 拉斯 | 3, 5 |
9 | 离开 | 3 |
10 | 与 | 4 |
相关性算法
例如搜索谷歌
匹配了多个文档,对多个文档计算相关分进行排序
TF-IDF 算法
ES5
前使用。
- TF(Term Frequency): 检索词在一篇文档中出现的频率
- DF(Document Frequency): 检索词在所有文档出现的频率
- IDF(Inverse Document Frequency)
- IDF = log(全部文档数/检索词出现过的文档总数)
- 词条权重
TF-IDF 公式
(TF(WORD)*IDF(WORD))
BM25
ES 当前版本 默认算法
URI 检索
URI QUERY
GET {{LOCAL_ES}}/some_index/_search?q=李白
DSL 检索
{{LOCAL_ES}}/some_index/_search
{
"from": 0,
"size": 10,
"sort": [
{
"id": "desc"
}
],
"query": {
"match_all": {}
}
}
term
精准匹配 { "query": { "term": { "author":"李白" } } } 多值匹配,使用 terms
{
"query": {
"terms": {
"author":["李白","杜甫"]
}
}
}
模糊查询
查询 author
包含"李"的数据
{
"query": {
"match": {
"author":"李"
}
}
}
查询所有文档
{
"query": {
"match_all": {
}
}
}
不查询任何文档
{
"query": {
"match_none": {
}
}
}
多字段查询
contents
和author
都包含李
{
"query": {
"multi_match": {
"query":"李",
"fields":["author","contents"]
}
}
}
boolean 查询
{
"query": {
"match": {
"contents": {
"query": "天 下", # 两个词都存在
"operator": "and"
}
}
}
}
phrase 查询
短语查询 天下 ``红颜
按先后顺序存在,中间最多出现一个额外词。
{
"query": {
"match_phrase": {
"contents":{
"query": "天下 红颜",
"slop":1
}
}
}
}
范围查询
查询 10 <= cont_length <= 50
{
"query": {
"range": {
"cont_length":{
"gte":10,
"lte":50
}
}
}
}
正则表达式查询
{
"query": {
"regexp":{
"type":{
"value":"[七|五]言"
}
}
}
}