您当前的位置: 首页 > 慢生活 > 程序人生 网站首页程序人生
elasticSearch创建指定字段的搜索分析器(空白分析仪与简单分析仪)
发布时间:2021-09-10 18:01:20编辑:雪饮阅读()
首先我们来看两个分析仪。
空白分析仪:
请求正文:
{
"analyzer": "whitespace",
"text": "The quick brown fox."
}
响应正文:
{
"tokens": [
{
"token": "The",
"start_offset": 0,
"end_offset": 3,
"type": "word",
"position": 0
},
{
"token": "quick",
"start_offset": 4,
"end_offset": 9,
"type": "word",
"position": 1
},
{
"token": "brown",
"start_offset": 10,
"end_offset": 15,
"type": "word",
"position": 2
},
{
"token": "fox.",
"start_offset": 16,
"end_offset": 20,
"type": "word",
"position": 3
}
]
}
可以看到空白分析仪可以将字串拆分出来的令牌是有分大小写的,像这里的令牌The而不是the。
那么再来看看简单分析仪
请求正文:
{
"analyzer": "simple",
"text": "The quick brown fox."
}
响应正文:
{
"tokens": [
{
"token": "the",
"start_offset": 0,
"end_offset": 3,
"type": "word",
"position": 0
},
{
"token": "quick",
"start_offset": 4,
"end_offset": 9,
"type": "word",
"position": 1
},
{
"token": "brown",
"start_offset": 10,
"end_offset": 15,
"type": "word",
"position": 2
},
{
"token": "fox",
"start_offset": 16,
"end_offset": 19,
"type": "word",
"position": 3
}
]
}
可以看到简单分析仪拆分出来的令牌中都是小写的,将全部术语都转换为小写了。
接下来我们来指定搜索分析器,像是给索引字段指定分析器一样,索引字段除了可以指定分析器还可以指定搜索分析器。
请求正文:
{
"mappings": {
"properties": {
"title": {
"type": "text",
"analyzer": "whitespace",
"search_analyzer": "simple"
}
}
}
}
响应正文:
{
"acknowledged": true,
"shards_acknowledged": true,
"index": "my-index-000001"
}
上面这个索引不仅指定了分析器为空白分析器,还指定了搜索分析器为简单分析器。
那么接下来我们来试试搜索这个title字段,体会下一个字段同时拥有分析器和搜索分析器的效果。为了这个测试,我们需要先建立一个测试数据:
请求正文:
{
"title":"An apple Simple simple", "description":"ICSE", "street":"West End",
"state":"UP", "zip":"250002", "location":[28.9926174, 77.692485], "fees":3500,
"tags":["fully computerized"], "rating":"4.5"
}
响应正文:
{
"_index": "my-index-000001",
"_type": "_doc",
"_id": "4",
"_version": 3,
"result": "updated",
"_shards": {
"total": 2,
"successful": 2,
"failed": 0
},
"_seq_no": 2,
"_primary_term": 1
}
首先这类title中是包含有An的,那么我用小写an来测试下搜索
请求正文:
{
"query": {
"match": {
"title": {
"query": "an"
}
}
}
}
响应正文:
{
"took": 3,
"timed_out": false,
"_shards": {
"total": 1,
"successful": 1,
"skipped": 0,
"failed": 0
},
"hits": {
"total": {
"value": 0,
"relation": "eq"
},
"max_score": null,
"hits": []
}
}
可见小写an是搜索不到的,那么更好大写An试试
请求正文:
{
"query": {
"match": {
"title": {
"query": "An"
}
}
}
}
响应正文:
{
"took": 4,
"timed_out": false,
"_shards": {
"total": 1,
"successful": 1,
"skipped": 0,
"failed": 0
},
"hits": {
"total": {
"value": 0,
"relation": "eq"
},
"max_score": null,
"hits": []
}
}
这就奇怪了,为什么大写An是包含于title中的,但是为什么搜索不到呢?
这是因为空白分析器拆出的令牌是分大小写的,那么自然是有An的。
但是搜索分析器我们用的是简单分析器,而简单分析器拆出的是只有小写的,即an。
用an去搜索An肯定是搜索不到的,这里不要以为搜索时候就直接是你的搜索词,因为搜索词可能不仅仅是单词,而是有可能是一个句子,那么人家就要拆分成单词的形式来分别去关联搜索(一般情况下)。
那么此时若你用Simple去搜索会发现也是能搜索到文档的,这是因为title中有包含Simple和simple,那么实际上这里搜索分析器是用小写去搜索的,而字段自身的分析器空白分析器则是包含大小写Simple和simple,所以能搜索到,则搜到的是对应的小写的这个simple。
你可以试试把title中的小写simple给去除了再搜索就不行了。
那么你若换成用simple去搜自然也就可以搜索到了。
关键字词:elasticSearch,指定字段,搜索分析器,空白分析仪,简单分析仪,simple,whitespace
相关文章
- elasticSearch为查询指定搜索分析器(stop分析器)
- elasticSearch创建指定字段分析器
- elasticSearch创建custom分析器char_filter,tokenizer
- elasticSearch创建custom分析器搭载html条带字符过滤
- elasticSearch内置分析器(停用词的使用)
- elasticSearch索引中创建自定义分析器(custom)及按分
- elasticSearch测试分析仪-标准标记器与ASCII码折叠标
- elasticSearch测试分析仪
- elasticSearch类型的自动创建、动态映射与cluster.rou
- elasticSearch集群重新路由