Elasticsearch学习笔记:multi-fields

本文介绍了Elasticsearch中multi-fields的概念,用于在同一字段上实现不同的索引方式,如将字符串字段映射为text字段进行全文搜索,以及keyword字段用于排序和聚合。通过fields参数可以定义多个字段。示例中展示了如何设置一个field为text和keyword类型,并进行了数据插入、查询及排序操作。

multi-fields

It is often useful to index the same field in different ways for different purposes. This is the purpose of multi-fields. For instance, a string field could be mapped as a text field for full-text search, and as a keyword field for sorting or aggregations.
You can define as many fields with the fields parameter as you want.
Please note that this option is only available for core data types and not for the objects.

对一个field设置多种索引方式。比如,一个字符串设置为”text”类型用于进行全文检索,同时又给它设置”keyword”类型用于排序或聚合。

#对需要设置的字段,在'type'属性后增加"fields": 
#其中的"raw"为自定义的名称,想象它是city的一个分身。
PUT /my_index
{
  "mappings": {
    "my_type": {
      "properties": {
        "city": {
          "type": "text",
          "fields": {
            "raw": {
              "type": "keyword"
            }
          }
        }
      }
    }
  }
}

插入数据

PUT /my_index/my_type/1
{
  "city": "New York"
}
PUT /my_index/my_type/2
{
  "city": "York"
}

查询并排序
查询字段为city,使用它的text类型.排序使用了city.raw

GET /my_index/_search
{
  "query": {
    "match": {
      "city": "York"
    }
  },
  "sort": {
    "city.raw": "asc"
  }
}
### 三级标题:Docker Compose ELK Stack 网络与版本冲突修复 在使用 `docker-compose.yml` 配置 ELK 栈时,若指定的 `version: '3.8'` 并出现网络错误 `service "logstash" refers to undefined network elk-net`,说明服务中引用了未定义的自定义网络。为确保容器间的通信正常运行,必须在 `networks` 段显式声明所有自定义网络[^1]。 #### 正确配置自定义网络 在 YAML 文件顶部添加如下网络声明: ```yaml networks: elk-net: driver: bridge ``` Logstash、Elasticsearch 和 Kibana 的服务配置需统一使用该网络: ```yaml logstash: image: docker.elastic.co/logstash/logstash:7.2.0 networks: - elk-net ports: - "5044:5044" - "9600:9600" depends_on: - elasticsearch ``` --- #### 完整 ELK 栈配置示例(适配 Logstash 7.2.0) 以下是一个适用于 Logstash 7.2.0 的 `docker-compose.yml` 示例片段,确保兼容性与功能性: ```yaml version: '3.8' networks: elk-net: driver: bridge services: elasticsearch: image: docker.elastic.co/elasticsearch/elasticsearch:7.2.0 container_name: elasticsearch environment: - discovery.type=single-node ports: - "9200:9200" - "9300:9300" networks: - elk-net logstash: image: docker.elastic.co/logstash/logstash:7.2.0 container_name: logstash ports: - "5044:5044" - "9600:9600" volumes: - ./logstash.conf:/usr/share/logstash/pipeline/logstash.conf depends_on: - elasticsearch networks: - elk-net kibana: image: docker.elastic.co/kibana/kibana:7.2.0 container_name: kibana ports: - "5601:5601" depends_on: - elasticsearch networks: - elk-net ``` --- #### 日志管道无输出问题排查 若 Logstash 启动成功但数据无法写入 Elasticsearch 或控制台无输出,可检查日志确认是否因安全认证失败导致: ``` [security_exception] unable to authenticate user [elastic] for REST request ``` 此错误表明 Logstash 使用的账号权限不足或未正确配置安全凭证。可在 Logstash 输出插件中明确指定用户名和密码: ```ruby output { elasticsearch { hosts => ["http://elasticsearch:9200"] user => "elastic" password => "your_secure_password" } } ``` 此外,确保 Elasticsearch 已关闭安全验证或已正确配置 TLS 加密与用户权限管理[^2]。 --- #### 网络连通性验证 进入 Logstash 容器并测试对 Elasticsearch 的访问能力: ```bash docker exec -it logstash bash curl -v http://elasticsearch:9200 ``` 若返回 `Connection refused`,应进一步检查 Elasticsearch 是否启动成功,并确认其绑定地址是否为 `0.0.0.0` 而非仅限于 `localhost`。 --- #### 版本兼容性建议 Logstash 7.2.0 属于较旧版本,需确保与 Elasticsearch 和 Kibana 的版本一致,避免因协议变更或功能弃用导致不可预见的问题。官方推荐使用相同主版本的组件以保证稳定性。对于新部署项目,建议优先考虑更新至 8.x 系列以获得更好的安全性与性能优化。 ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值