2024-03-13
原文作者:吴声子夜歌 原文地址: https://blog.csdn.net/cold___play/article/details/104831207
9、format参数

在JSON格式文档中,日期用字符串表示。Elasticsearch利用一系列的预先设定的格式来识别和分析这些字符串,产生一个长整型数值,代表世界标准时间的毫秒数。

除了内置的格式之外,也可以使用通俗的yyyy/MM/dd语法来指定自定义格式:

    PUT /myindex2
    {
      "mappings": {
        "test2":{
          "properties": {
            "date":{"type": "date", "format": "yyyy-MM-dd"}
          }
        }
      }
    }

许多支持日期值的接口也支持日期匹配表达式,例如now-1m/d表示当前的时间减去一个月,并且四舍五入到最近的一天。

日期格式:

202403132036395231.png

202403132036399642.png

202403132036414993.png

10、ignore_above参数

比ignore_above设置长的字符串不会被分词或索引。这主要用于不分词的字符串字段,这些字符串通常用来过滤、聚合以及排序。这些都是结构化的字段,让这些字段索引非常长的索引词通常是不明智的。

    PUT /myindex2
    {
      "mappings": {
        "test2":{
          "properties": {
            "message":{
              "type": "keyword",
              "index": false, 
              "ignore_above": 20//message字段会忽略任何长度超过20个字符的字符串
            }
          }
        }
      }
    }
    
    PUT /myindex2/test2/1 //该文档会被成功索引
    {
      "message":"Syntax error"
    }
    
    PUT /myindex2/test2/2 //该文档会被索引,但是不会索引message字段的值
    {
      "message":"Syntax error with some long stacktrace"
    }

注意:ignore_above的值是字符数,而Lucene是字节计数。如果使用UTF-8文本与许多非ASCII字符,可能需要设置限制为32766/3 = 10922。因为UTF-8字符会占用最多3个字节。

11、ignore_malformed参数

通常对于收到的数据没有做更多的控制。一个用户发送的login字段可能是日期,另一个发送的login字段可能是电子邮件地址。

默认情况下,在试着索引错误的数据类型的时候会抛出异常并拒绝整个文档。如果ignore_malformed参数被设置为true,异常会被忽略。错误字段不会被索引,但文档中的其它字段会正常处理。

    PUT /myindex2
    {
      "mappings": {
        "test2":{
          "properties": {
            "number_one":{"type": "integer"},
            "number_two":{"type": "integer", "ignore_malformed": true}
          }
        }
      }
    }
    
    PUT /myindex2/test2/1//该文档会被拒绝
    {
      "text":"Some text value",
      "number_one":"foo"
    }
    
    PUT /myindex2/test2/2//该文档仅会索引text字段
    {
      "text":"Some text value",
      "number_two":"foo"
    }

index-level默认
index.mapping.ignore_malformed设置可以用在索引级别上,在所有映射类型中忽略错误内容:

    PUT /myindex2
    {
      "settings": {"index.mapping.ignore_malformed":true}, 
      "mappings": {
        "test2":{
          "properties": {
            "number_one":{"type": "integer"},
            "number_two":{"type": "integer", "ignore_malformed": true}
          }
        }
      }
    }
12、include_in_all参数

include_in_all参数对每个字段进行控制是否被包含在_all字段中。默认值为true,除非索引被设为no。

include_in_all参数还可以被设置在类型级别以及对象或嵌入字段,所有的子字段会继承这个设置:

    PUT /myindex2
    {
      "mappings": {
        "test2":{
          "include_in_all":false,
          "properties": {
            "title":{"type": "text"},
            "author":{
              "include_in_all": true,
              "properties": {
                "first_name":{"type":"text"},
                "last_name":{"type":"text"}
              }
            },
            "editor":{
              "properties": {
                "first_name":{"type":"text"},
                "last_name":{"type":"text","include_in_all":true}
              }
            }
          }
        }
      }
    }
13、index参数

index选项控制字段值如何进行索引,以及如何搜索。接受如下三种值:

  • no:不要在索引中加入这个字段的值。利用这个设置,字段不会被查询到。
  • not_analyzed:字段值原封不动地添加到索引中,作为单一索引词。除了字符串字段之外的所有字段默认支持这个选项。
  • analyzed:这个选项仅仅用在字符串字段上,作为默认选项。字符串首先被分词为一组索引词,然后被索引。在搜索的时候,查询字符串会通过相同的分词器生产相同格式的索引词。正是由于这个过程,使得全文搜索成为可能。
14、index_options参数

index_options参数控制将什么信息添加到反向索引,用于搜索和强调的目的。接受下面的参数:

  • docs:只有被索引的文档数量。可以解决『字段中是否包含这个索引词』的问题。
  • freqs:被索引的文档数量和索引词频率。索引词频率用来使重复索引词的得分高于单个索引词。
  • positions:文档数量,索引词频率以及索引词位置。位置可以被用于临近或短语查询。
  • offsets:文档数量,索引词频率、位置以及开始和结束字符偏移量(映射索引词到原始字符串)

分词字符串字段利用positions作为默认值,其他字段利用docs作为默认值。

    PUT /myindex2
    {
      "mappings": {
        "test2":{
          "properties": {
            "text":{"type": "text", "index_options": "offsets"}
          }
        }
      }
    }
15、fields参数

多字段的目的是基于不同得目的用不同得方法索引相同得字段。

例如,一个字符串字段可以作为分词字段被索引用于全文搜索,也可以作为不可分词字段用于排序或聚合:

    PUT /myindex2
    {
      "mappings": {
        "test2":{
          "properties": {
            "city":{//city字段是分词字段,可以用来进行全文搜索。
              "type": "text",
              "fields": {//city.raw字段可以用来排序或聚合
                "raw":{"type": "text","index": false}
              }
            }
          }
        }
      }
    }

使用多重分词器:
另一种多字段得情况是用不同得方式对相同得字段进行分词来达到更好得相关性。

例如,可以索引一个字段,利用标准分词器将文本划分为单词,然后利用英文分词器把单词划分为它们得词根形式:

    PUT /myindex2
    {
      "mappings": {
        "test2":{
          "properties": {
            "text":{
              "type": "text",
              "fields": {
                "english":{"type": "text","analyzer": "english"}
              }
            }
          }
        }
      }
    }
    //text字段使用标准分词器,text.english字段使用英文分词器
    PUT /myindex2/test2/1
    {
      "text":"quick brown fox"
    }
    
    PUT /myindex2/test2/2
    {
      "text":"quick brown foxes"
    }
    //两个文档得text.english字段均包含fox索引词,因为foxes得词根是fox
    GET /myindex2/test2/_search?q=text:fox
    GET /myindex2/test2/_search?q=text.english:fox
16、norms参数

norms存储各种标准化系数(一个数字),表示相关字段得长度和索引时相关性加权设置。将会用在查询的时候计算文档对于查询条件得相关性得分。

虽然对于计算相关性得分非常有用,但是norms也需要大量得内存。所以,如果不需要在一个特殊得字段上计算相关性得分,应该在字段上禁用norms。在这种情况下,字段仅仅用于过滤或聚合。

norms可以利用PUT映射接口取消(不能被重新启用):

    PUT /myindex2
    {
      "mappings": {
        "test2": {
          "properties": {
            "title":{
              "type": "text",
              "norms": false
            }
          }
        }
      }
    }
17、null_value参数

空值是不能被索引或搜索得。当一个字段设置为null(或者是一个空数组或者null值的数组),这个字段会当做没有值得字段。

null_value参数可以用指定得值替换掉确切得空值,以便可以被索引和搜索。

    PUT /myindex2
    {
      "mappings": {
        "test2":{
          "properties": {
            "status_code":{
              "type": "text",
              "null_value": "xxxx"
            }
          }
        }
      }
    }
    
    PUT /myindex2/test2/1
    {
      "status_code":null
    }
    
    PUT /myindex2/test2/2
    {
      "status_code":[]
    }
    //该"null_value"字段映射不改变存储的值,而它的变化是在搜索中使用的值。
    POST /myindex2/test2/_search
    {
      "query": {
        "match": {
          "status_code": "xxxx"
        }
      }
    }
18、position-increment_gap参数

为了可以支持短语查询,需要保存可分词字符串字段中分词得位置。当字符串字段索引多个值,一个『虚拟』缺口会被加到各个值之间来防止短语查询跨值匹配。缺口得大小可以利用position_increment_gap配置,默认值是100.

    PUT /myindex2
    {
      "mappings": {
        "test2":{
          "properties": {
            "names":{"type": "text","position_increment_gap": 0}
          }
        }
      }
    }
    
    PUT /myindex2/test2/1
    {
      "names":["John Abraham","Lincoln Smith"]
    }
    //下一个元素数组得第一个索引词与上一个元素数组得随后一个索引词之间会有0个索引词间隔
    POST /myindex2/test2/_search
    {
      "query": {
        "match_phrase": {
          "names": "Abraham Lincoln"
        }
      }
    }
    //短语查询匹配文档是怪异得,但是这正是我们在映射中要求的
19、precision_step参数

大多数的数字型数据类型索引额外得索引词表示每个数字得范围,使范围查询更加便捷:

    "range":{
    	"number":{"gte":0,"lte":321}
    }
    
    这从本质上作为索引词查询,结构如下:
```js
    "terms":{
    	"number":["0-255","256-319""320","321"]
    }

precision_step的默认值取决与数字型字段的类型。

20、properties参数

类型映射,对象字段和嵌套类型字段包含子字段,成为属性。这些属性可以是任何数据类型,包含对象和嵌套类型。

属性在以下情况中添加:

  • 创建索引的时候明确定义
  • 利用创建映射接口添加或修改映射类型的时候明确定义
  • 索引包含新字段的文档可以动态添加
    PUT /myindex2
    {
      "mappings": {
        "test2":{
          "properties": {
            "manager":{
              "properties": {
                "age":{"type":"integer"},
                "name":{"type":"text"}
              }
            },
            "employees":{
              "type": "nested",
              "properties": {
                "age":{"type":"integer"},
                "name":{"type":"text"}
              }
            }
          }
        }
      }
    }

点符号:查询、集合等方法可以使用点符号获取内部字段:

    GET /myindex2/_search
    {
      "query": {
        "match": {
          "manager.name": "Alice White"
        }
      },
      "aggs": {
        "Employees": {
          "nested": {
            "path": "employees"
          },
          "aggs": {
            "Employee Ages": {
              "histogram": {
                "field": "employees.age",
                "interval": 5
              }
            }
          }
        }
      }
    }
21、search_analyzer参数

通常,索引时和搜索时应该使用相同的分词器,确保查询时的索引词和反向索引中的索引词有相同的格式。

但有些时候,在搜索时使用不同的分词器是有意义的,比如当使用edge_ngram标记器来自动完成。

默认情况下,查询会使用字段映射中定义的分词器,但是可以利用serch_analyzer设置来重写配置:

    PUT /myindex2
    {
      "settings": {
        "analysis": {
          "filter": {
            "autocomplete_filter":{"type":"edge_ngram","min_gram":1,"max_gram":20}
          },
          "analyzer": {
            "autocomplete":{
              "type":"custom",
              "tokenizer":"standard",
              "filter":["lowercase","autocomplete_filter"]
            }
          }
        }
      },
      "mappings": {
        "test2": {
          "properties": {
            "text":{"type": "text","analyzer": "autocomplete", "search_analyzer": "standard"}
          }
        }
      }
    }

分词器设置定义了自定义的自动完成分词器。
text字段在索引的时候使用自动完成分词器,在搜索的时候使用标准分词器。

22、store参数

默认情况下,字段值被索引来确保可以被搜索,但是不会被存储。这意味着可以查询字段,但是无法取回原始字段值。

通常这么做没有什么问题。字段值早已是默认存储的-source字段的一部分。如果仅仅想取回单个字段或一些字段的值,而不是整个_source字段,可以通过数据源过滤来实现:

    PUT /myindex2
    {
      "mappings": {
          "test2": {
          "properties": {
            "title":{"type": "text", "store": true},
            "date":{"type": "date", "store": true, "format":"yyyy/MM/dd"},
            "content":{"type": "text"}
          }
        }
      }
    }
    
    
    
    
    PUT /myindex2/test2/1
    {
      "title":"testTitle",
      "date":"2015/09/12",
      "content":"xxxxx"
    }
    
    //title和date字段会被存储,该请求可以取回title和date的字段值
    POST /myindex2/_search
    {
      "stored_fields":["title","date"]
    }
23、term_vector参数

索引词向量包含分析过程产生的索引词信息,包括:

  • 索引词列表
  • 每个索引词的位置(或顺序)
  • 映射索引词到原始字符串中的原始位置中开始和结束字符的偏移量

这些索引词向量会被存储,所以作为一个特殊文档取回

term_vector 设置接受以下参数:

  • no:不存储索引词向量(默认)
  • yes:只存储字段的索引词
  • with_positions:索引词和位置将会被存储
  • with_offsets:索引词和字符偏移量会被存储
  • with_positions_offsets:索引词,位置以及字符偏移量都会被存储

示例:

    PUT /myindex2
    {
      "mappings": {
        "test2": {
          "properties": {
            "text":{"type": "text","term_vector": "with_positions_offsets"}
          }
        }
      }
    }
阅读全文