elasticsearch之解除索引只读问题、filter、sort、解除索引最大查询数的限制、reindex迁移数据、boost条件权重控制

1、解除索引只读问题

1、查看是否存在只读属性

GET /personal_report_chapter_es/_settings

2、解除只读命令

PUT _settings
{
  "index":{
    "blocks":{
      "read_only_allow_delete":"false"
    }
  }
}

2、filter命令

        返回的文档必须满足filter子句的条件。但是跟Must不一样的是,不会计算分值, 并且可以使用缓存。

        从上面的描述来看,你应该已经知道,如果只看查询的结果,must和filter是一样的。区别是场景不一样。如果结果需要算分就使用must,否则可以考虑使用filter

GET kibana_sample_data_ecommerce/_search
{
  "size": 1000, 
  "query": {
    "bool": {
      "must": [
        {"term": {
          "currency": "EUR"
        }}
      ],
      "filter": {
        "range": {
          "order_date": {
            "gte": "2020-01-25T23:45:36.000+00:00",
            "lte": "2020-02-01T23:45:36.000+00:00"
          }
        }
      }
    }
  }
}

简单来讲,如果你的业务场景不需要算分,使用filter可以真的让你的查询效率飞起来

3、sort命令

sort命令用来对查询的数据针对某些字段进行排序

3.1、查询上映在2016到2018年的所有的电影,再根据上映时间的倒序进行排序

GET movies/_search
{
    "query": {
        "range": {
            "year": {
                "gte": 2016,
                "lte": 2018
            }
         }
    },
    "sort": [
        {
            "year": {
                "order": "desc"
            }
        }
    ]
}

3.2、sort支持设置多个字段参与排序

GET /offline_sales/_search
{
    "sort" : [
        { "sale_date" : {"order" : "asc"}},
        "total_price",
        { "order_id" : "desc" },
        "_score"
    ]
}

4、解除索引最大查询数的限制

方案1:在设置索引属性时解除索引最大查询数的限制

put _all/_settings
{
"index.max_result_window":200000
}

_all表示所有索引,针对单个索引的话修改成索引名称即可

方案2::在创建索引的时候加上

"settings":{
        "index":{
              "max_result_window": 500000
      }
}

这样设置完毕之后还不行,如果继续使用原来的API进行查询,查询到的结果最大数量仍然是10000,这时候需要在API中添加这样一行代码:

searchSourceBuilder.trackTotalHits(true);

5、使用reindex命令迁移数据

POST _reindex
{
  "source": {
    "index": "old_index",
	"size":1000   //可选,每次批量提交1000个,可以提高效率,建议每次提交5-15M的数据
  },
  "dest": {
    "index": "en_law"
  }
}

将老索引的数据迁移到新索引中

6、 boost条件权重控制

        我们在使用ES进行查询时常常遇到这样的场景:需要根据用户输入的查询关键字同时去匹配多个字段,并且希望对匹配字段的权重做不同的设置,比如同时去匹配公司名称和公司简介,这里一般需要提升公司名称匹配的权重,这样得出的相关性评分才会更准确。
在ES中,我们可以通过boost参数来控制多字段查询的权重。

        boost是一个用来修改文档的相关性的参数,默认值是1。可以通过设置不同的值,提升该字段在相关性评分的权重。

GET /personal_report_chapter_es/_search
{
  "_source": {"includes": ["title","chapterTextContent","chapterId"]},
  "query": {
    "bool": {
       "should": [
         {
           "match": {
             "title": {
               "query": "8月经济继续向好",
                "boost": 10
             }
             
           }
         },
         {
           "match": {
             "chapterTextContent":{
              "query": "8月经济继续向好",
               "boost": 5
             }
           }
         }
       ]
    }
  },
  "sort": [
    {
      "_score": {
        "order": "desc"
      }
    }
  ],
  "from": 0,
  "size": 50
}

注意:这个的chapterTextContent和title字段都要设置权重,否则会不准确,设置一个高一个低即可

multi_match+boost一起使用

GET /personal_report_chapter_es/_search
{
  "_source": {"includes": ["createTime","title","chapterTextContent","chapterId"]},
  "query": {
     "multi_match": {
       "query": "国务院",
       "fields": ["title^10","chapterTextContent"]
     }
  }
}

title^10 代表搜索提升10倍相关性,也就是说用户搜索的时候其实以这个title为主,desc为辅,title的匹配相关度当然要提高权重比例了。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值