ElasticSearch中文检索学习总结

0.先上教程

https://es.xiaoleilu.com/010_Intro/15_API.html         Es电子书30分钟入门。看完可以自己用c#或java写个框架了。

https://www.elastic.co/guide/cn/elasticsearch/guide/current/_retrieving_a_document.html          Es官网,这个随便看一看吧,主要是上面。

https://www.jianshu.com/p/07c4dddae43a          linux中 curl命令参数解释,需看懂这个才知道用。

1.http请求基础及常见错误

Es常用http请求:
curl -X<VERB> '<PROTOCOL>://<HOST>:<PORT>/<PATH>?<QUERY_STRING>' -d '<BODY>'
VERB HTTP方法:GET, POST, PUT, HEAD, DELETE
PROTOCOL http或者https协议(只有在Elasticsearch前面有https代理的时候可用)
HOST Elasticsearch集群中的任何一个节点的主机名,如果是在本地的节点,那么就叫localhost
PORT Elasticsearch HTTP服务所在的端口,默认为9200
PATH API路径(例如_count将返回集群中文档的数量),PATH可以包含多个组件,例如_cluster/stats或者_nodes/stats/jvm
QUERY_STRING 一些可选的查询请求参数,例如?pretty参数将使请求返回更加美观易读的JSON数据
BODY 一个JSON格式的请求主体(如果请求需要的话)

elaticsear no [query] registered for [filtered] 过滤查询错误
https://blog.csdn.net/zhongzunfa/article/details/81147906
es进行聚合操作时提示Fielddata is disabled on text fields by default 错误,用put解决
https://blog.csdn.net/u011403655/article/details/71107415
es自动生成的id长22个字符为uuid。

问题:
关于分词的大部分 Mapping 是无法修改的,即便能修改也是没有意义的;
因为修改前的数据并不会因为你的修改而生效,你必需重新覆盖写入才能生效,所以依旧推荐新建索引,然后使用 reindex 同步数据。

http://localhost:9200/_cat/indices?v   所有索引列表
http://localhost:9200/_cat/nodes?v    所有节点列表

2.常用

其实常用的在上面的Es电子书中有。这里主要记录ik分词器的使用,首先你的Es得装上ik分词器。有 ik_smart 和 ik_max_word两个。这里记录 ik_samrt 。

测试ik分词的效果

get 192.168.50.233:9200/_analyze?pretty
raw text
{
  "analyzer": "ik_smart",
  "text": "中华人民共和国国歌"
}

结果:分成了两个,自行测试 ik_max_word的效果。也可以测试 standard 标准分词器的效果。
{
    "tokens": [
        {
            "token": "中华人民共和国",
            "start_offset": 0,
            "end_offset": 7,
            "type": "CN_WORD",
            "position": 0
        },
        {
            "token": "国歌",
            "start_offset": 7,
            "end_offset": 9,
            "type": "CN_WORD",
            "position": 1
        }
    ]
}

ik分词主要用于中文搜索时可以很好的分词搜索,达到预期效果。

但所有的index/type/id中的属性字段默认使用standard分词器,ik分词器需要手动映射到对应的属性字段才能使用。(其它分词器也一样)

映射如下给testliuyan/person下的属性name映射ik分词器,前提是person对象不存在或name属性字段不存在,因为已存在的话,默认已使用了标准分词器,使用下面的http请求会报错。可以映射完之后,再添加数据,这时person数据对应name属性字段默认才使用ik分词器,但其他字段还是标准分词器。但映射之前又需索引存在

加个索引,但无数据

put 192.168.50.233/索引名称
put 192.168.50.233:9200/testliuyan/_mapping/person
{
    "properties": {
        "name": {
            "type":      "string",
            "analyzer":  "ik_smart"
        }
    }
}

结果: 
{
    "acknowledged": true
}
即代表映射成功。

添加一条数据来测试:

put 192.168.50.233:9200/testliuyan/person/2
{
"name":"123浙江中好国",
"oname":"123浙江中好国"
}

查询:

get 192.168.50.233:9200/testliuyan/person/_search
{
    "query" : {
        "match" : {
            "name" : "中国"
        }
    }
}

结果:
无,因为 ik分词器将 中国 看为一个整体。

把上面换成查字段 oname,该字段使用默认分词器。
则会查出刚刚我们加的那条数据,因为默认分词器将 中国 分为 中 和 国 , 数据只要包含这两个中一个即可。

其实还有一种方法可以配置Es全局属性,可以设置ik分词为默认配置,不用一个一个索引去设置了。

put http://192.168.50.233:9200/_template/rtf
{
  "template":   "*", 
  "mappings": {
    "_default_": {
      "_all": { 
        "enabled": true
      },
      "dynamic_templates": [
        {
          "strings": { 
            "match_mapping_type": "string",
            "mapping": {
              "type": "text",
              "analyzer":"ik_max_word",
              "ignore_above": 256,
              "fields": {
                "keyword": {
                  "type":  "keyword"
                }
              }
            }
          }
        }
      ]
    }
  }
}

get是查看配置

不过和上面的一样,新数据有效,旧数据由于已经映射了以前的默认分词。现在改配置也无法生效。

解决办法:

https://blog.csdn.net/aiyaya_/article/details/79567091   

https://blog.csdn.net/tclzsn7456/article/details/79958554

可以通过重建索引解决,不过这里只能一条一条索引去搞。

对于以前的大量索引我也是无能为力,希望有人告知如何解决?

3.索引删除用法

教程:https://www.cnblogs.com/Dev0ps/p/9493576.html

    1、#删除指定索引
    # curl -XDELETE -u elastic:changeme http://localhost:9200/acc-apply-2018.08.09
    {"acknowledged":true}
    2、#删除多个指定索引,中间用逗号隔开
    # curl -XDELETE -u elastic:changeme http://localhost:9200/acc-apply-2018.08.09,acc-apply-2018.08.10
    3、#模糊匹配删除
    # curl -XDELETE -u elastic:changeme http://localhost:9200/acc-apply-*
    {"acknowledged":true}
    4、#使用通配符,删除所有的索引
     curl -XDELETE http://localhost:9200/_all
     或 curl -XDELETE http://localhost:9200/*
    _all ,* 通配所有的索引
    通常不建议使用通配符,误删了后果就很严重了,所有的index都被删除了
    禁止通配符为了安全起见,可以在elasticsearch.yml配置文件中设置禁用_all和*通配符
    action.destructive_requires_name = true
    这样就不能使用_all和*了

 5、#获取当前索引
 # curl -u elastic:changeme 'localhost:9200/_cat/indices?v'

    6、如果存储不够可以设置定时删除,下面是保留3天的日志

30 2 * * * /usr/bin/curl -XDELETE -u elastic:changeme http://localhost:9200/*-$(date -d '-3days' +'%Y.%m.%d') >/dev/null 2>&1

以下是定时删除脚本:

1

2

3

#!/bin/bash

time=$(date -'-3days' +'%Y.%m.%d')

curl -XDELETE -u elastic:changeme http://localhost:9200/*-${time}

4.短语匹配用法

如果你的es实在是没有ik分词器这种东西,那就只好在搜索之前用第三方其他的分词接口分词了,然后再把结果使用es中的短语匹配,同样可以达到分词搜索的效果。

es中短语匹配的用法:

get  192.168.50.233:9200/nowuser3/newcomputer/_search
{
  "query": {
    "bool": {
      "should": [
                  { "match_phrase": { "name": "中国浙江" }},
                  { "match_phrase": { "name": "345"   }}
      ]
    }
  }
}

中国浙江 和 345 为第三方其他分词接口将原搜索字符串分好后返回的结果。

Es中匹配name包含中国浙江 或 name包含345的结果。

如果把should改成must,should代表or , must代表 and.
还有一种 must not 一看就懂。

猜你喜欢

转载自blog.csdn.net/qq_38261174/article/details/98479558