Вы хотели бы использовать поле text
для того, что вы ищете, и выполнить такое требование через Ngram Tokenizer
Нижепримерное отображение, запрос и ответ:
Отображение:
PUT mysomeindex
{
"mappings": {
"mydocs":{
"properties": {
"ManufacturerName":{
"type": "text",
"analyzer": "my_analyzer",
"fields":{
"keyword":{
"type": "keyword",
"normalizer": "my_normalizer"
}
}
}
}
}
},
"settings": {
"analysis": {
"normalizer": {
"my_normalizer":{
"type": "custom",
"char_filter": [],
"filter": ["lowercase", "asciifolding"]
}
},
"analyzer": {
"my_analyzer": {
"tokenizer": "my_tokenizer",
"filter": [ "synonyms" ]
}
},
"tokenizer": {
"my_tokenizer": {
"type": "ngram",
"min_gram": 3,
"max_gram": 5,
"token_chars": [
"letter",
"digit"
]
}
},
"filter": {
"synonyms":{
"type": "synonym",
"synonyms" : ["henry loyd, henry loid, henry lloyd => henri lloyd"]
}
}
}
}
}
Обратите внимание, что поле ManufacturerName
является мультиполем , которое имеет оба text
тип и его родной тип keyword
.Таким образом, для точных совпадений и для запросов агрегации вы можете использовать поле keyword
, тогда как для этого требования вы можете использовать поле text
.
Образец документа:
POST mysomeindex/mydocs/1
{
"ManufacturerName": "ripcurl"
}
POST mysomeindex/mydocs/2
{
"ManufacturerName": "henri lloyd"
}
Что делаетasticsearch, когда вы загружаете вышеуказанный документ, он создает токены размером от 3
до 5
и сохраняет их в инвертированном индексе длянапример, `rip, ipc, pcu и т. д. *
. Вы можете выполнить следующий запрос, чтобы увидеть, какие токены создаются:
POST mysomeindex/_analyze
{
"text": "ripcurl",
"analyzer": "my_analyzer"
}
Также я бы посоветовал вам посмотреть Edge Ngram токенизатор и посмотрите, подходит ли он лучше для ваших требований.
Запрос:
POST mysomeindex/_search
{
"query": {
"match": {
"ManufacturerName": "rip curl"
}
}
}
Ответ:
{
"took": 2,
"timed_out": false,
"_shards": {
"total": 5,
"successful": 5,
"failed": 0
},
"hits": {
"total": 1,
"max_score": 0.25316024,
"hits": [
{
"_index": "mysomeindex",
"_type": "mydocs",
"_id": "1",
"_score": 0.25316024,
"_source": {
"ManufacturerName": "ripcurl"
}
}
]
}
}
Запрос на синонимы:
POST mysomeindex/_search
{
"query": {
"match": {
"ManufacturerName": "henri lloyd"
}
}
}
Ответ:
{
"took": 1,
"timed_out": false,
"_shards": {
"total": 5,
"successful": 5,
"failed": 0
},
"hits": {
"total": 1,
"max_score": 2.2784421,
"hits": [
{
"_index": "mysomeindex",
"_type": "mydocs",
"_id": "2",
"_score": 2.2784421,
"_source": {
"ManufacturerName": "henry lloyd"
}
}
]
}
}
Примечание: Если вы намереваетесь использовать синонимы, то лучше всего, чтобы они были в текстовом файле и добавляли их относительно папки config
, как указано здесь
Надеюсь, это поможет!