ElasticSearch 索引与搜索时间分析器
ElasticSearch index vs search time analyzer
运行 遇到了一个问题,这让我觉得我没有完全理解 ElasticSearch 5.5 中的索引与搜索时间分析。
假设我有一个只有 name
和 state
的人的基本索引。为简单起见,我将 al => alabama
设置为唯一的状态同义词。
PUT people
{
"mappings": {
"person": {
"properties": {
"name": {
"type": "text"
},
"state": {
"type": "text",
"analyzer": "us_state"
}
}
}
},
"settings": {
"analysis": {
"filter": {
"state_synonyms": {
"type": "synonym",
"synonyms": "al => alabama"
}
},
"analyzer": {
"us_state": {
"filter": [
"standard",
"lowercase",
"state_synonyms"
],
"type": "custom",
"tokenizer": "standard"
}
}
}
}
}
我的理解是,当我索引文档时,state
字段数据将被索引为扩展的同义词形式。这个可以测试运行ning:
GET people/_analyze
{
"text": "al",
"field": "state"
}
哪个returns
{
"tokens": [
{
"token": "alabama",
"start_offset": 0,
"end_offset": 2,
"type": "SYNONYM",
"position": 0
}
]
}
看起来不错,让我们索引文档:
POST people/person
{
"name": "dave",
"state": "al"
}
并执行搜索:
GET people/person/_search
{
"query": {
"bool": {
"should": [
{
"term": {
"state": "al"
}
}
]
}
}
}
哪个returns什么都没有:
{
"took": 3,
"timed_out": false,
"_shards": {
"total": 5,
"successful": 5,
"failed": 0
},
"hits": {
"total": 0,
"max_score": null,
"hits": []
}
}
我希望搜索中的 al
通过相同的 us_state
分析器 运行 并匹配我的文档。但是,如果我将查询更改为:
,搜索确实有效
"term": { "state": "alabama" }
这是因为您使用了不分析输入的 term
查询。您应该将其更改为使用 match
查询,一切都会好起来的
GET people/person/_search
{
"query": {
"bool": {
"should": [
{
"match": {
"state": "al"
}
}
]
}
}
}
运行 遇到了一个问题,这让我觉得我没有完全理解 ElasticSearch 5.5 中的索引与搜索时间分析。
假设我有一个只有 name
和 state
的人的基本索引。为简单起见,我将 al => alabama
设置为唯一的状态同义词。
PUT people
{
"mappings": {
"person": {
"properties": {
"name": {
"type": "text"
},
"state": {
"type": "text",
"analyzer": "us_state"
}
}
}
},
"settings": {
"analysis": {
"filter": {
"state_synonyms": {
"type": "synonym",
"synonyms": "al => alabama"
}
},
"analyzer": {
"us_state": {
"filter": [
"standard",
"lowercase",
"state_synonyms"
],
"type": "custom",
"tokenizer": "standard"
}
}
}
}
}
我的理解是,当我索引文档时,state
字段数据将被索引为扩展的同义词形式。这个可以测试运行ning:
GET people/_analyze
{
"text": "al",
"field": "state"
}
哪个returns
{
"tokens": [
{
"token": "alabama",
"start_offset": 0,
"end_offset": 2,
"type": "SYNONYM",
"position": 0
}
]
}
看起来不错,让我们索引文档:
POST people/person
{
"name": "dave",
"state": "al"
}
并执行搜索:
GET people/person/_search
{
"query": {
"bool": {
"should": [
{
"term": {
"state": "al"
}
}
]
}
}
}
哪个returns什么都没有:
{
"took": 3,
"timed_out": false,
"_shards": {
"total": 5,
"successful": 5,
"failed": 0
},
"hits": {
"total": 0,
"max_score": null,
"hits": []
}
}
我希望搜索中的 al
通过相同的 us_state
分析器 运行 并匹配我的文档。但是,如果我将查询更改为:
"term": { "state": "alabama" }
这是因为您使用了不分析输入的 term
查询。您应该将其更改为使用 match
查询,一切都会好起来的
GET people/person/_search
{
"query": {
"bool": {
"should": [
{
"match": {
"state": "al"
}
}
]
}
}
}