社区所有版块导航
Python
python开源   Django   Python   DjangoApp   pycharm  
DATA
docker   Elasticsearch  
aigc
aigc   chatgpt  
WEB开发
linux   MongoDB   Redis   DATABASE   NGINX   其他Web框架   web工具   zookeeper   tornado   NoSql   Bootstrap   js   peewee   Git   bottle   IE   MQ   Jquery  
机器学习
机器学习算法  
Python88.com
反馈   公告   社区推广  
产品
短视频  
印度
印度  
Py学习  »  Elasticsearch

999 - Elasticsearch Analysis 01

歌哥 • 5 年前 • 379 次点击  
阅读 3

999 - Elasticsearch Analysis 01

简介

Analysis在创建索引或搜索时指定,将文本解析成倒排索引,以供搜索。
简单解释下倒排索引:通常书本的目录就是正排索引,根据目录找章节;而倒排索引就是根据内容(例如一个单词)找所在的章节。

Analyzer

analyzer,内置或自定义,是一个包含三个构建块(依次为character filterstokenizerstoken filters)的包。

例如:一个内置的english analyzer在转换句子The QUICK brown foxes jumped over the lazy dog!时:

  1. 转为小写。
  2. 删除对搜索无意义的词元:the(停止词,stopwords)。
  3. 归纳词干,例如:foxes → fox,jumped → jump,lazy → lazi。
  4. 最后添加这些条件到倒排索引中:[quick, brown, fox, jump, over, lazi, dog]。
  5. 当查询时,可以查询"a query fox",虽然该字符串不在原文本中,但当使用了同样的analyzer时,该句子中的单词与倒排索引中的词元可以匹配上。

Character filters

  • 接收字符流,通过添加、删除、修改字符来转换字符流。
  • 例如从流中去掉<b>这样的HTML元素。
  • 可以有0或多个,按照设置的顺序调用。

Tokenizer

  • 接收一个字符流,分解为词元,然后输出词元流。
  • 例如,whitespace tokenizer就会把所有的空白符去掉,"Quick brown fox!"就会被分解成词元:[Quick, brown, fox!]
  • 同时Tokenizer负责记录每个词元的顺序或位置,以及原单词的起始结束字符偏移量。
  • 必须而且只能有一个Tokenizer。

Token filters

  • 接收词元流,可以添加、删除、修改词元。
  • 例如:lowercase token filter将所有的词元转为小写,stop token filter删除掉停止词,synonym toekn filter将引入同义词到词元流中。
  • Token filter不可以改变每个词元的位置或字符偏移量。
  • 可以有0或多个,按照设置的顺序调用。

测试analyzers

可以在请求体中指定analyzer(或者tokenizer、token filter、Character Filter),

GET _analyze
{
  "analyzer": "whitespace", 
  "text": "The quick brown fox."
}

GET _analyze
{
  "analyzer": "english", 
  "text": "The QUICK brown foxes jumped over the lazy dog!"
}

GET _analyze
{
  "tokenizer": "whitespace", 
  "filter": ["lowercase","stop"], 
  "text": "The QUICK brown foxes jumped over the lazy dog!"
}
复制代码

从上面第二个的返回结果中可以看到位置和起始结束字符偏移量

offset:词项边界,用于高亮查询。

position:在文档中的位置,用于保证词语查询的词语的顺序。

{
  "tokens" : [
    {
      "token" : "quick",
      "start_offset" : 4,
      "end_offset" : 9,
      "type" : "<ALPHANUM>",
      "position" : 1
    },
    {
      "token" : "brown",
      "start_offset" : 10,
      "end_offset" : 15,
      "type" : "<ALPHANUM>",
      "position" : 2
    },
    {
      "token" : "fox",
      "start_offset" : 16,
      "end_offset" : 21,
      "type" : "<ALPHANUM>",
      "position" : 3
    },
    {
      "token" : "jump",
      "start_offset" : 22,
      "end_offset" : 28,
      "type" : "<ALPHANUM>",
      "position" : 4
    },
    {
      "token" : "over",
      "start_offset" : 29,
      "end_offset" : 33,
      "type" : "<ALPHANUM>",
      "position" : 5
    },
    {
      "token" : "lazi",
      "start_offset" : 38,
      "end_offset" : 42,
      "type" : "<ALPHANUM>",
      "position" : 7
    },
    {
      "token" : "dog",
      "start_offset" : 43,
      "end_offset" : 46,
      "type" : "<ALPHANUM>",
      "position" : 8
    }
  ]
}
复制代码
Python社区是高质量的Python/Django开发社区
本文地址:http://www.python88.com/topic/46605
 
379 次点击