建议器功能
对用户搜索的内容做纠正帮助用户搜索到精确度高的关键字
搜索关键字的时候做出补全的功能
建议器种类
词条建议器(term suggester)
词组建议器(phrase suggester)
完成建议器 (completion suggester)
上下文建议器(context suggester)
term suggester
功能:主要做纠正 但是是短语就不能做了(分析后)
PUT s1
{
"mappings": {
"doc":{
"properties": {
"title":{
"type":"text",
"analyzer":"standard"
}
}
}
}
}
PUT s1/doc/1
{
"title": "Lucene is cool"
}
PUT s1/doc/2
{
"title": "Elasticsearch builds on top of lucene"
}
GET s1/doc/_search
{
"query": {
"match": {
"title": "lucene"
}
},
"suggest": {
"my_s1": {
"text": "lucne",
"term": {
"field": "title"
}
}
}
}
GET s1/doc/_search
{
"suggest": {
"my_s2": {
"text": "lucne",
"term": {
"field": "title"
}
},
"my_s3":{
"text":"lune",
"term":{
"field":"title"
}
}
}
}
GET s1/doc/_search
{
"suggest": {
"text": "lucne",
"my_s4": {
"term": {
"field": "title"
}
},
"my_s5":{
"term":{
"field":"title"
}
}
}
}
建议器字段
1 text:建议文本,建议文本是必需的选项,可以通过全局(多个建议器中查询相同的内容)或者按照单个建议器的格式来。 2 field:从field字段中获取候选建议的字段。这是一个必需的选项,需要全局设置或根据建议设置。 3 analyzer:用于分析建议文本的分析器。默认为建议字段的搜索分析器。 4 size:个建议文本标记返回的最大条目。 5 sort:定义如何根据建议文本术语对建议进行排序。它有两个可能的值。 6 score,先按分数排序,然后按文档频率排序,再按术语本身排序。 7 frequency,首先按文档频率排序,然后按相似性分数排序,然后按术语本身排序。也可以理解为按照流行度排序。 8 suggest_mode:控制建议的模式,有3个模式可选择。 9 missing,仅为不在索引中的建议文本术语提供建议。这是默认值。 10 popular,仅建议在比原始建议文本术语更多的文档中出现的建议。也就是说提供比原有输入词频更高的词条 11 always,根据建议文本中的条款建议任何匹配的建议。说白了就是无论如何都会提供建议。 12 lowercase_terms:在文本分析之后降低建议文本术语的大小写。 13 min_word_length:建议文本术语必须具有的最小长度才能包含在内。默认为4.(旧名称min_word_len已弃用)。 14 shard_size:设置从每个单独分片中检索的最大建议数。在减少阶段,仅根据size选项返回前N个建议。默认为该 size选项。将此值设置为高于该值的值size可能非常有用,以便以性能为代价获得更准确的拼写更正文档频率。由于术语在分片之间被划分,因此拼写校正频率的分片级文档可能不准确。增加这些将使这些文档频率更精确。 15 max_inspections:用于乘以的因子, shards_size以便在碎片级别上检查更多候选拼写更正。可以以性能为代价提高准确性。默认为5。 16 string_distance:用于比较类似建议术语的字符串距离实现。 17 internal,默认值基于damerau_levenshtein,但高度优化用于比较索引中术语的字符串距离。 18 damerau_levenshtein,基于Damerau-Levenshtein算法的字符串距离算法。 19 levenshtein,基于Levenshtein编辑距离算法的字符串距离算法。 20 jaro_winkler,基于Jaro-Winkler算法的字符串距离算法。 21 ngram,基于字符n-gram的字符串距离算法。
phrase suggester
适合较长的字段,但是也不是万能的 做纠正
GET s1/doc/_search
{
"suggest": {
"my_s6": {
"text": "lucne is cool",
"phrase": {
"field": "title"
}
}
}
}
DELETE s2
PUT s2
{
"mappings": {
"doc": {
"properties": {
"title": {
"type": "text",
"analyzer": "ik_max_word"
}
}
}
}
}
PUT s2/doc/1
{
"title": "Lucene is cool"
}
PUT s2/doc/2
{
"title": "Elasticsearch builds on top of lucene"
}
PUT s2/doc/3
{
"title": "Elasticsearch rocks"
}
PUT s2/doc/4
{
"title": "Elastic is the company behind ELK stack"
}
PUT s2/doc/5
{
"title": "elk rocks"
}
PUT s2/doc/6
{
"title": "elasticsearch is rock solid"
}
GET s2/doc/_search
{
"suggest": {
"my_s1": {
"text": "lucne and elasticsear rock",
"phrase": {
"field": "title",
"highlight":{
"pre_tag":"<em class='xxxx'>",
"post_tag":"</em>"
}
}
}
}
}
completion suggester
速度要快 输入的内容立即返回 对字段类型要求多节省存储空间 时间复杂度O(1),做建议不做纠错
PUT s5
{
"mappings": {
"doc":{
"properties":{
"title":{
"type":"completion",
"analyzer":"ik_smart"
}
}
}
}
}
PUT s5/doc/1
{
"title":"Lucene is cool"
}
PUT s5/doc/2
{
"title":"Elasticsearch builds on top of lucene"
}
PUT s5/doc/3
{
"title":"Elasticsearch rocks"
}
PUT s5/doc/4
{
"title":"Elastic is the company behind ELK stack"
}
PUT s5/doc/5
{
"title":"the elk stack rocks"
}
PUT s5/doc/6
{
"title":"elasticsearch is rock solid"
}
GET s5/doc/_search
{
"suggest": {
"my_s5": {
"text": "elas",
"completion": {
"field": "title"
}
}
}
}
特殊映射中支持的参数
1 analyzer,要使用的索引分析器,默认为simple。 2 search_analyzer,要使用的搜索分析器,默认值为analyzer。 3 preserve_separators,保留分隔符,默认为true。 如果您禁用,您可以找到以Foo Fighters开头的字段,如果您建议使用foof。 4 preserve_position_increments,启用位置增量,默认为true。如果禁用并使用停用词分析器The Beatles,如果您建议,可以从一个字段开始b。注意:您还可以通过索引两个输入来实现此目的,Beatles并且 The Beatles,如果您能够丰富数据,则无需更改简单的分析器。 5 max_input_length,限制单个输入的长度,默认为50UTF-16代码点。此限制仅在索引时使用,以减少每个输入字符串的字符总数,以防止大量输入膨胀基础数据结构。大多数用例不受默认值的影响,因为前缀完成很少超过前缀长于少数几个字符。
建议映射还可以定义在已存在索引字段的多字段
PUT s6
{
"mappings": {
"doc": {
"properties": {
"name": {
"type": "text",
"fields": {
"suggest": {
"type": "completion"
}
}
}
}
}
}
}
PUT s6/doc/1
{
"name":"KFC"
}
PUT s6/doc/2
{
"name":"kfc"
}
GET s6/doc/_search
{
"suggest": {
"my_s6": {
"text": "K",
"completion": {
"field": "name.suggest"
}
}
}
}
在索引阶段提升相关性
在索引字段中加建议 并且分析的时候关键字搜索的时候也是关键字
PUT s7
{
"mappings": {
"doc":{
"properties":{
"name":{
"type":"text",
"fields":{
"suggest":{
"type":"completion",
"analyzer":"keyword",
"search_analyzer":"keyword"
}
}
}
}
}
}
}
PUT s7/doc/1
{
"name":"KFC"
}
PUT s7/doc/2
{
"name":"kfc"
}
GET s7/doc/_search
{
"suggest": {
"my_s7": {
"text": "K",
"completion": {
"field": "name.suggest"
}
}
}
}
权重与输入框
PUT s8
{
"mappings": {
"doc":{
"properties":{
"title":{
"type": "completion"
}
}
}
}
}
PUT s8/doc/1
{
"title":{
"input":"blow",
"weight": 2
}
}
PUT s8/doc/2
{
"title":{
"input":"block",
"weight": 3
}
}
GET s8/doc/_search
{
"suggest": {
"s3": {
"text": "bl",
"completion": {
"field": "title"
}
}
}
}
PUT s8/doc/3
{
"title": [
{
"input":"appel",
"weight": 2
},
{
"input":"apple",
"weight": 3
}
]
}
PUT s8/doc/4
{
"title": ["apple", "appel", "block", "blow"],
"weght": 32
}
GET s8/doc/_search
{
"suggest": {
"s4": {
"text": "app",
"completion": {
"field": "title"
}
}
}
}
在搜索阶段提升相关性
GET s8/doc/_search
{
"suggest": {
"my_s9": {
"text": "blaw",
"completion": {
"field": "title",
"size": 2,
"fuzzy": {
"fuzziness": 2,
"min_length": 3,
"prefix_length": 2
}
}
}
}
}
返回指定字段_source size返回2条 skip_duplicates过滤掉重复牺牲了一些性能
GET s8/doc/_search
{
"suggest": {
"completion_suggest": {
"text": "appl",
"completion": {
"field": "title",
"size":2,
"skip_duplicates":true
}
}
},
"_source": "title"
}
正则
GET s5/doc/_search
{
"suggest": {
"completion_suggest": {
"regex": "e[l|e]a",
"completion": {
"field": "title"
}
}
}
}
更多关注https://www.elastic.co/guide/en/elasticsearch/reference/current/search-suggesters.html