elasticsearch对数组进行搜索

写在前面

我们在进行全文建搜的时候往往会添加很多前置条件,比如地区,时间,以及知识点树,我们需要在搜索之前先进行过滤在进行搜索.

Array索引

es的数据类型中实际上是不包含数组类型的,在默认的情况下任何字段都可以包含0或者是更多的值,并且全部的值在这个数组中必须保持一致

In Elasticsearch, there is no dedicated array type. Any field can contain zero or more values by default, however, all values in the array must be of the same datatype. For instance:

  • an array of strings: [ “one”, “two” ]
  • an array of integers: [ 1, 2 ]
  • [ 1, 2, 3 ]
  • an array of objects: [ { “name”: “Mary”, “age”: 12 }, { “name”: “John”, “age”: 10 }]

NOTE
如果你想在数组中使用Object的类型,这种情况下是不被允许的,我们如果想使用Object就必须通过设置nested字段来生命这是一个对象数组!!

我们的映射字段不需要进行任何的配置,在默认的情况下我们就可以使用数组,这是开箱即用的:

{
  "mappings": {
    "test": {
      "properties": {
        "id": {
          "type": "long"
        },
        "points": {
          "type": "long"
        },
        "stem": {
          "type": "text",
          "fields": {
            "keyword": {
              "type": "keyword",
              "ignore_above": 2048
            }
          },
          "analyzer": "ik_smart"
        },
        "choose": {
          "type": "text",
          "fields": {
            "keyword": {
              "type": "keyword",
              "ignore_above": 2048
            }
          }
        }
      }
    }
  }
}

添加一条测试数据

{
  "id":1,
  "stem":"今天天气真好啊",
  "choose":["诶呀我去","连上了"],
  "points":[23,31,53]
}

这里我直接指定了几个基本的属性,对同一个字段保存多个值进行测试

Array搜索

数组字段的搜索很简单,我们平时遇到的场景也有很多,就像前文中提到的,当我们需要根据多个先决条件进行搜索的时候.
这里points保存了知识点的数组(有多个值构成),在搜素的时候我们为了保证该试题下包含所有的内容,就是用bool的must进行多个字段的搜索,实例如下:

{
  "query": {
    "bool": {
      "must": [
        {
          "term": {
            "points": {
              "value": "23"
            }
          }
        },{
          "term": {
            "points": {
              "value": "31"
            }
          }
        },
        {
          "term": {
            "points": {
              "value": "53"
            }
          }
        }
      ]
    }
  }
}

搜索的结果可想而知,所有所有的内容都必须包含上述的三级知识点,如果需要不同级别的知识点,只需要对搜索条件进行调整即可.

  {
    "_index": "test_drup",
    "_type": "test",
    "_id": "1",
    "_score": 3,
    "_source": {
      "id": 1,
      "stem": "今天天气真好啊",
      "choose": [
        "诶呀我去",
        "连上了"
      ],
      "points": [
        23,
        31,
        53
      ]
    }
  }

搜索结果只展示一部分

评论 9
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值