全文检索

分词

将文本转换为单词的过程,称为分词

例如 Good Day 分词后good day

分词器

分词的技术实现

倒排索引

由词到文档

例如有以下下文档

DocIdDoc
1谷歌地图之父跳槽 Facebook
2谷歌地图之父加盟 Facebook
3谷歌地图创始人拉斯离开谷歌加盟 Facebook
4谷歌地图之父跳槽 Facebook 与 Wave 项目取消有关
5谷歌地图之父拉斯加盟社交网站 Facebook

倒排后

WordIdWordDocIds
1谷歌1, 2, 3, 4, 5
2地图1, 2, 3, 4, 5
3之父1, 2, 4, 5
4跳槽1, 4
5Facebook1, 2, 3, 4, 5
6加盟2, 3, 5
7创始人3
8拉斯3, 5
9离开3
104

相关性算法

例如搜索谷歌匹配了多个文档,对多个文档计算相关分进行排序

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": {
        }
    }
}

多字段查询

contentsauthor都包含李

{
    "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":"[七|五]言"
            }
        }
    }
}

多字段复合查询

Last Updated:
Contributors: himcs