当前位置: 首页 > article >正文

es 3期 第16节-运用启发式特性引导用户查询

#### 1.Elasticsearch是数据库,不是普通的Java应用程序,传统数据库需要的硬件资源同样需要,提升性能最有效的就是升级硬件。
#### 2.Elasticsearch是文档型数据库,不是关系型数据库,不具备严格的ACID事务特性,任何企图直接替代严格事务性场景的应用项目都会失败!!!

##### 索引字段与属性都属于静态设置,若后期变更历史数据需要重建索引才可生效
##### 对历史数据无效!!!!
##### 一定要重建索引!!!!

### suggester启发式查询应用
# 基于text字段哦
# 依据用户输入关键字,引导用户输入完整的搜索词;用户在首次搜索时,也无法知晓已有搜索引擎中存在哪些有效的关键字可以搜索
# 应用行业:电商领域、知识图谱等

## 启发式查询本质
# 查询本质全文检索时检索文档内容本身;启发式检索时检索文档分词词项本身;

## 启发式背后原理
# ES对于文本词项,会进行分词,将分词相关信息存储起来,有分词的位置信息,分词的各种红统计信息等。启发式搜索基于倒排索引,仅仅去搜索词项即可,无需搜索词项之后的文档,搜索词项依据词项之间的距离。
# 注意,在启发式搜索中,单个词项必须是非完整的

## 启发式查询分类
# 启发式查询分类
# term:单个词项
# pharse:短语
# completion:自动完成
# context:上下文

## Term suggester
# 概念解释
# 基于单个分词进行启发式搜索,全部能力等同term搜索

GET kibana_sample_data_logs/_search
# 分析logs索引message字段text文本分词结果
POST _analyze
{
  "text":[
    "223.87.60.27 - - [2018-07-22T00:39:02.912Z] \"GET /elasticsearch/elasticsearch-6.3.2.deb_1 HTTP/1.1\" 200 6219 \"-\" \"Mozilla/5.0 (X11; Linux x86_64; rv:6.0a1) Gecko/20110421 Firefox/6.0a1\""
    ]
}
# 这里搜索linux是查文本内容
GET kibana_sample_data_logs/_search
{
  "track_total_hits":true,
  "query":{
    "match": {
      "message": "linux"
    }
  }
}
# 搜索linux,故意缺少最后一个字母x
# 这里搜索linu是查倒排索引
GET kibana_sample_data_logs/_search
{
  "track_total_hits":true,
  "suggest":{
    // 这里可以自定义取字段名
    "message_suggest":{
      "text":"linu",
      "term":{
        "field":"message"
      }
    }
  }
}
# 查询词项多个查询
GET kibana_sample_data_logs/_search
{
  "track_total_hits":true,
  "suggest":{
    // 这里可以自定义取字段名
    "message_suggest":{
      "text":"linu kiban window",
      "term":{
        "field":"message"
      }
    }
  }
}

# 查询多个词项查询
GET kibana_sample_data_logs/_search
{
  "track_total_hits":true,
  "suggest":{
    // 这里可以自定义取字段名
    "message_suggest":{
      "text":"linu",
      "term":{
        "field":"message"
      }
    },
    "agent_suggest":{
      "text":"windo",
      "term":{
        "field":"agent"
      }
    }
  }
}

# request 参数
# 常用参数
# text,关键字,输入的启发式词项,注意,词项不可完整,否则无法展现
# field,关键字,指定搜索的字段,注意,必须是 text类型
# analyzer,关键字,输入内容指定不同的分词器,建议与 text类型一致
# size,关键字,限制返回待选择的词项数量,默认不限制
# sort,关键字,启发式搜索结果排序,支持score=分值,frequency=词频,默认分值
# suggest_mode,关键字,启发式词项筛选,范围取值 mission=未索引的词项,popular=热度高的词项,always=符合条件的词项,默认popular

# sort 参数解读
# suggest_mode 参数解读
# 参数      说明
# missing   未索引的词项
# popular   热度高的词项
# always    符合条件的词项

# 查询参数使用
GET kibana_sample_data_logs/_search
{
  "track_total_hits":true,
  "suggest":{
    // 这里可以自定义取字段名
    "message_suggest":{
      "text":"linu",
      "term":{
        "field":"message",
        // 全部有5个,限制只返回3个
        "size":3,
        // 设置根据词频排序,默认根据分值排序
        "sort":"frequency",
        // 这个可以不掌握,比较难懂,涉及到很多算法,需要深入学习
        "suggest_mode":"popular"
      }
    }
  }
}

# 高级参数
# shard_size,关键字,多分片查询时,需要限制分片返回的词项数量,建议值大于 size 即可,size是取最终结果的返回数量,注意与这个区分开
# max_edits,关键字,控制字符容错数量的,默认全部支持,类同fuzz词项搜索,根据需求设置长度;取值范围1~2,默认 2
# prefix_length,关键字,控制输入内容的前缀长度,默认1,可有效减少计算量
# min_word_length,关键字,它确保只有长度大于或等于指定值的单词会被用于生成建议
# max_inspections,关键字,分片词项数量shard_size 的倍数,默认5
# min_doc_freg,关键字,现在返回词项,词项必须满足文档匹配最低的数量,默认 0=没有限制, es 7.0后废弃了
# max_term_freg,关键字,词项出现的频率, es 7.0后废弃了
# string_distance,关键字,词项字符计算距离的方式,支持多种高级的数学算法,建议专业性去看此方面论文,默认internal,其他值 damerau_levenshtein, levenshtein, jaro_winkler, ngram

# 查询参数使用
GET kibana_sample_data_logs/_search
{
  "track_total_hits":true,
  "suggest":{
    // 这里可以自定义取字段名
    "message_suggest":{
      "text":"Mozil",
      "term":{
        "field":"message",
        // 全部有5个,限制只返回3个
        "size":3,
        "shard_size":4,
        // 每个分片允许返回的数量
        "max_inspections":5,
        "min_word_length":4,
        "prefix_length":1
      }
    }
  }
}

## Phrase suggester
# 短语启发式搜索,功能类同 mathc phrase,基多个词进行搜索,且可以控制词项之间的步长
# 启发式搜索中,输入的分词内容,必须是不完整的单词,若完整则无法计算与其它相似词的距离,也就无法返回搜索的结果。
# 内部算法基于 ngram-language 语法模型实现
## 查询参数
# 关键字,启发搜索查询表达式suggest,
# phrase,关键字,指定短语搜索的字段
# highlight,关键字,匹配的关键字高亮,用于标记内容
# size,关键字,控制返回的短语数量
# analyzer,关键字,设置分词器
# shard_size,关键字,分片返回的短语选项,默认大于size 值
# gram_size,关键字,NGram 模型,自然语言处理 NLP 领域,详细的去查阅相关论文(非分词领域勿过度深入)默认 1
# real_word_error_likelihood,关键字,控制字符串拼错率,取值 0~1,默认 0.95,容许 0.05 容错;反过来,就是字符串的相似度
# confidence,关键字,置信度,控制返回结果的数据量,取值 0~1,默认1,有命中的就返回,无命中的不返回
# max_errors,关键字,最大错误短语数量,默认 1,控制匹配到的返回短语错误数据量,调整值,会增加返回的数据。
# separator,关键字,NGram 语言模型的分隔符,默认基于空格,详细的可以去查阅相关论(文非分词领域勿过度深入)
# collate,关键字,收缩模型,短语搜索收缩,涉及到搜索内部执行过程,此处不深入展开;取值范围 true/false,默认 false
# smoothing 关键字,语言模型参数,smoothing_models=stupid_backoff,laplace,linear_interpolation

GET kibana_sample_data_logs/_search
{
  "track_total_hits":true,
  "query":{
    "match": {
      "message": "plugins wordpress"
    }
  }
}
GET kibana_sample_data_logs/_search
{
  "track_total_hits":true,
  "suggest":{
    // 这里可以自定义取字段名
    "message_suggest":{
      "text":"plugi wordpre",
      "phrase":{
        "field":"message",
        "highlight":{
          "pre_tag": "<h1>",
          "post_tag": "</h1>"
        }
        
      }
    }
  }
}

## direct_generator 高级参数
# 以下很多参数,需要对于分词领域有深入了解,才可以深入,否则不建议过度深入。
# direct_generator,关键字,候选短语生成的方向,往前或者往后
# max_edits,关键字,控制字符容错数量的,默认全部支持,类同fuzzy词项搜索,根据需求设置长度
# prefix_length,关键字,控制输入内容的前缀长度,默认1,可有效减少计算量
# min_word_length,关键字,控制筛选后的词项最低长度,默认是4,最小值可以设置1
# shard_size,关键字,多分片查询时,需要限制分片返回的词项数量,建议值大干 size 即可
# max_inspections,关键字,分片词项数量shard size 的倍数,默认5
# min_doc_freg,关键字,现在返回词项,词项必须满足文档匹配最低的数量,默认 0=没有限制
# pre_filter,关键字,前置分词器(后面分词器专讲)
# post_filter,关键词,前置分词器(后面分词器专讲)
# suggest_mode,关键字,参考前面term,默认missing

# suggest_mode, 参数解读
# 参数        说明
# missing     未索引的词项
# popular     热度高的词项
# always      符合条件的词项

GET kibana_sample_data_logs/_search
{
  "track_total_hits":true,
  "suggest":{
    // 这里可以自定义取字段名
    "message_suggest":{
      "text":"plugi wordpre",
      "phrase":{
        "field":"message",
        "highlight":{
          "pre_tag": "<h1>",
          "post_tag": "</h1>"
        },
        "direct_generator":[
          {
            "field":"message",
            "size":10,
            "suggest_mode":"always",
            "max_edits":2,
            "prefix_length":1,
            "min_word_length":4,
            "max_inspections":5,
            "min_doc_freq":1,
            "pre_filter":"simple",
            "post_filter":"simple"
          }
        ]
      }
    }
  }
}

 

## Completion suggester
# 始数据结构化,并发基于倒排索引,而是基于FST,便于提升搜自动补全,基于 completion 数据字段类型,将度索效率,可快速响应。
# 与前面 term/phase 差异也在与搜索内容的完整性,必须输入词项的完整性,不能有错误的词项拼写

# 先创建索引
# 自动补全机制,其底层依赖数据结构与普通索引不一样,必须提前设置好字段类型以及字段属性
# type,字段类型,必须为:completion
# analyzer,分词器,默认为:simple,注意分词器不同,自动补全的效果不一致
# search analyzer,查询分词器,默认与analyzer一致
# preserve_separators,默认 true,是否容许分隔符,不容许的话,多个词项之间会出现连接
# preserve_position_increments,默认 true,是否去除停用词(分词领域)
# max_input length,默认 50,限制匹配字符的长度,设置上限,防止性能过多膨胀

DELETE kibana_sample_data_flights_completion
PUT kibana_sample_data_flights_completion
{
  "mappings":{
    "properties":{
      "Dest_completion":{
        "type":"completion",
        "analyzer":"simple",
        "search_analyzer":"simple",
        "preserve_separators": true,
        "preserve_position_increments":true,
        "max_input_length":50
      },
      "Origin_completion":{
        "type":"completion"
      }
    }
  }
}
GET kibana_sample_data_flights_completion/_mappings
POST _reindex
{
  "source": {
    "index": "kibana_sample_data_flights"
  },
  "dest": {
    "index": "kibana_sample_data_flights_completion"
  },
  "script": {
    "source": """
    ctx._source.Dest_completion=ctx._source.Dest;
    ctx._source.Origin_completion=ctx._source.Origin;
    """
  }
}

 # 查询常用
# suggest,查询表达式
# prefix,查询表达式,:输入查询内容,基于前缀匹配模式
# text,查询表达式,输入查询内容,必须全部匹配完整的
# completion,查询表达式,选择自动补全查询模式
# field,指定自动补全字段
# size,控制返回数据的条数,默认5
# skip_duplicates,是否跳过重复的数据,取值范围 true/false,默认 false
# fuzzy,是否启用纠错性匹配查询,参数设置类同 term-fuzzy 查询模块

# 全匹配搜索
GET kibana_sample_data_flights_completion/_search
{
  "suggest":{
    "Dest_completion":{
      "text":"Edmonton International Airport",
      "completion":{
        "field":"Dest_completion",
        // 控制返回的数量
        "size": 2,
        // 跳过重复的数据
        "skip_duplicates":true,
        "fuzzy": {
          "fuzziness":1,
          "transpositions": true,
          "min_length": 3,
          "prefix_length": 1,
          "unicode_aware": true
        }
      }
    }
  }
}
# 前缀搜索
GET kibana_sample_data_flights_completion/_search
{
  "suggest":{
    "Dest_completion":{
      "prefix":"Edmont",
      "completion":{
        "field":"Dest_completion"
      }
    }
  }
}
# Edmonton International Airport 跳过中间的单词International搜索,查不出来
GET kibana_sample_data_flights_completion/_search
{
  "suggest":{
    "Dest_completion":{
      "text":"Edmonton Airport",
      "completion":{
        "field":"Dest_completion"
      }
    }
  }
}
# regex,正则查询表达式,输入查询内容(建议少用或者不用)
GET kibana_sample_data_flights_completion/_search
{
  "suggest":{
    "Dest_completion":{
      "regex":"edmon.*",
      "completion":{
        "field":"Dest_completion"
      }
    }
  }
}

 # 数据填充
# 补全类型,支持2中不同的数据填充方式,一种默认纯文本,一种设定权重。
# input,输入内容
# weight,内容权重,影响搜索结果分值,影响排序

 

POST kibana_sample_data_flights_completion/_doc
{
  "Dest_completion": [
    "Edmonton International Airport",
    "Charles de Gaulle International Airport"
  ]
}

## Context suggester
# 自动补全机制依据关键字可以很快速的查询想要的词建议,但很多时候,希望可以依据内容的其它字段做一些上下文的限制
# 其中字段类型 completion上下文启发式查询,依然需要基于自动补全机制
# 如果非必要分词领域深入,可以忽略

# 关键参数
# completion,关键字,自动补全,设定 mapping字段类型;搜索检索查询表达式入口
# contexts,关键字,上下文,设定mapping上下文,用于后续限制上下文搜索

# 创建mapping复制数据
DELETE kibana_sample_data_flights_context
PUT kibana_sample_data_flights_context
{
  "mappings": {
    "properties": {
      "DestSug": {
        "type": "completion",
        "contexts": [
          {
            "name": "DestWeather",
            "type": "category"
          }
        ]
      }
    }
  }
}
#数据 1
POST kibana_sample_data_flights_context/_doc
{
  "DestSug": {
    "input": [
      "Manchester Airport"
    ],
    "contexts": {
      "DestWeather": [
        "Rain",
        "Clear"
      ]
    }
  }
}
#数据 2
POST kibana_sample_data_flights_context/_doc
{
  "DestSug": {
    "input": [
      "Manchester Airport"
    ],
    "contexts": {
      "DestWeather": [
        "Damamging",
        "Hail"
      ]
    }
  }
}
GET kibana_sample_data_flights_context/_search
GET kibana_sample_data_flights_context/_search
{
  "suggest":{
    "DestSug":{
      "prefix":"Mancheste",
      "completion":{
        "field":"DestSug",
        "size":10,
        "contexts":{
          "DestWeather":["Hail"]
        }
      }
    }
  }
}

 

## 上下文限制类型有 2种,一种基于文本类目,一种基于 geo 地理位置坐标。
# completion,自动补全字段类型
# contexts,字段上下文关系设置
# type=category,上下文关系为 类目方式
# type=geo,上下文关系为,地理位置关系(此处不再深入)
# path,指向字段,可以不设置,如果这样的,需要在填充数据时,设置指定

# type参数解读
# 类型值      说明
# category    基于类目方式限制
# geo         基于 gps 位置限制,此处不过渡探讨,属于专业领域

DELETE kibana_sample_data_flights_context
PUT kibana_sample_data_flights_context
{
  "mappings": {
    "properties": {
      "DestSug": {
        "type": "completion",
        "contexts": [
          {
            "name": "DestWeather",
            "type": "category",
            "path": "DestWeather"
          }
        ]
      },
      "OriginSug": {
        "type": "completion",
        "contexts": [
          {
            "name": "OriginWeather",
            "type": "category",
            "path": "OriginWeather"
          }
        ]
      }
    }
  }
}

 # 数据填充
# 上下文限制,数据填充方式依据 Mapping 规则,方式不一
# input,数据填充参数,依据 mapping 设置选择是否必须
# contexts,数据填充参数,依据 mapping 设置选择是否必须

#数据 1,未设置path字段,必须指明数据参数
POST kibana_sample_data_flights_context/_doc
{
  "DestSug": {
    "input": [
      "Manchester Airport"
    ],
    "contexts": {
      "DestWeather": [
         "Rain",
        "Clear"
      ]
    }
  }
}
#数据 2,设置了path字段指向,必须填充path字段内容
POST kibana_sample_data_flights_context/_doc
{
  "DestSug": [
    "Manchester Airport"
  ],
  "DestWeather": [
    "Damamging",
    "Hail"
  ]
}
GET kibana_sample_data_flights_context/_search

 ## Request 请求参数
# 查询常用
# suggest,查询表达式
# prefix,查询如数文本内容
# completion,查询类型,自动补全类型
# field,指定查询的字段
# size,限制返回的数据量
# contexts,指定上下文的字段与内容
# boost,调整上下文限制的优先级
# prefix,限制上下文内容的前缀,范围 true/false

# 重建索引,设置 mapping 上下文指向
# 执行检索,比对不同的结果
DELETE kibana_sample_data_flights_context
PUT kibana_sample_data_flights_context
{
  "mappings": {
    "properties": {
      "DestSug": {
        "type": "completion",
        "contexts": [
          {
            "name": "DestWeather",
            "type": "category",
            "path": "DestWeather"
          }
        ]
      },
      "OriginSug": {
        "type": "completion",
        "contexts": [
          {
            "name": "OriginWeather",
            "type": "category",
            "path": "OriginWeather"
          }
        ]
      }
    }
  }
}
# 数据复制,索引重建
POST _reindex
{
  "source": {
    "index": "kibana_sample_data_flights"
  },
  "dest": {
    "index": "kibana_sample_data_flights_context"
  },
  "script": {
    "source": """
      ctx._source.DestSug=ctx._source.Dest;
      ctx._source.OriginSug=ctx._source.Origin;
    """
  }
}
GET kibana_sample_data_flights_context/_search
# 查询1
GET kibana_sample_data_flights_context/_search
{
  "suggest":{
    "DestSug":{
      "prefix":"Mancheste",
      "completion":{
        "field":"DestSug",
        "size":10,
        "contexts":{
          "DestWeather":["Hail"]
        }
      }
    }
  }
}
# 查询2
GET kibana_sample_data_flights_context/_search
{
  "suggest": {
    "DestSug": {
      "prefix": "Mancheste",
      "completion": {
        "field": "DestSug",
        "size": 10,
        "contexts": {
          "DestWeather": [
            {
              "context": "Hail",
              "prefix": true,
              "boost": 1
            },
            {
              "context": "Clear",
              "boost": 10
            }
          ]
        }
      }
    }
  }
}

 ## 启发式查询类型
# 有一些场景需求,需要知晓查询启发式检索类型
# 查询参数
# typed_keys,关键字,用于输出启发式搜索类型

GET kibana_sample_data_logs/_search?typed_keys
{
  "suggest": {
    "message_sug": {
      "text": "plugi wordpres",
      "phrase": {
        "field": "message",
        "size": 10,
        "highlight":{
          "pre_tag": "<h1>",
          "post_tag": "</h1>"
        }
      }
    }
  }
}

 ## termvectors
# 借助分词能力,帮助分析统计索引词向量
# 包括词项出现的文档数量,出现的次数,词项出现的文章
# 查询参数
# termvectors,查询API
# 指定数据 ID
# fields,指定字段

# 查询1
GET kibana_sample_data_logs/_termvectors/roTR0Y8BbWz2Sn6EiJjA?fields=agent
# 查询2
GET kibana_sample_data_logs/_termvectors/roTR0Y8BbWz2Sn6EiJjA
{
  "fields": [
    "agent"
  ],
  "offsets": true,
  "payloads": true,
  "positions": true,
  "term_statistics": true,
  "field_statistics": true
}

 # Request 请求参数
# Url 参数
# fields,指定词向量统计分析的字段
# field statistics,是否返回此字段所有向量总体统计分析数据,取值范围 true/false,默认 false
# offsets,是否返回词向量位置,取值范围 true/false,默认 true
# payloads,是否返回负载值,具体的存储位置,取值范围 true/false,默认 true
# positions,是否包含词项的顺序位置,取值范围 true/false,默认 true
# preference,选择分片,默认随机,详细前面参考search 搜索部分内容
# routing,路由参数
# realtime,是否实时性
# term_statistics,词向量统计所有统计,取值范围true/false,默认false
# version,数据版本号
# version_type,数据版本类型

GET kibana_sample_data_logs/_termvectors/roTR0Y8BbWz2Sn6EiJjA?fields=agent&term_statistics=true&realtime=true

# suggesters 启发式
# https://www.elastic.co/guide/en/elasticsearch/reference/8.6/search-suggesters.html
# termvectors 词项量
# https://www.elastic.co/guide/en/elasticsearch/reference/8.6/docs-termvectors.html
# highlighting 高亮
# https://www.elastic.co/guide/en/elasticsearch/reference/8.6/highlighting.html
# search-as-you-type 自定义搜索类型
# https://www.elastic.co/guide/en/elasticsearch/reference/8.6/search-as-you-type.html


http://www.kler.cn/a/444398.html

相关文章:

  • libmodbus安装使用
  • Spring Boot--06--整合Swagger
  • Oracle 查询表占用空间(表大小)的方法
  • 《薄世宁医学通识50讲》以医学通识为主题,涵盖了医学的多个方面,包括医学哲学、疾病认知、治疗过程、医患关系、公共卫生等
  • Go vendor
  • SQL语句整理五-StarRocks
  • 个人秋招总结
  • 探索 CI/CD 工具的力量
  • 机械鹦鹉与真正的智能:大语言模型推理能力的迷思
  • 3、交换机IP路由功能
  • git企业开发的相关理论(二)
  • 使用xjar 对Spring-Boot JAR 包加密运行
  • GO OSS 前端直传 Presign
  • 快速解决oracle 11g中exp无法导出空表的问题
  • InnoDB 查询成本
  • 【Leetcode Top 100】105. 从前序与中序遍历序列构造二叉树
  • Python:动态粒子爱心
  • Spring IOC 和 AOP的学习笔记
  • Spring篇--xml方式整合第三方框架
  • linux CentOS系统上卸载docker
  • Android Binder 进程间通信
  • 肝了半年,我整理出了这篇云计算学习路线(新手必备,从入门到精通)
  • Diffusino Policy学习note
  • Unbuntu下怎么生成SSL自签证书?
  • 聊聊开源的虚拟化平台--PVE
  • 02、10个富士胶片模拟的设置