Я тоже не понимаю, о чем вы спрашиваете. Может быть, вы не очень хорошо понимаете перколятор? Это пример, который я только что попробовал.
Предположим, у вас есть индекс - назовем его test
- в котором вы хотите проиндексировать некоторые документы. Этот индекс имеет следующее отображение (просто случайный индекс теста, который я имею в моей настройке теста):
{
"settings": {
"analysis": {
"filter": {
"email": {
"type": "pattern_capture",
"preserve_original": true,
"patterns": [
"([^@]+)",
"(\\p{L}+)",
"(\\d+)",
"@(.+)",
"([^-@]+)"
]
}
},
"analyzer": {
"email": {
"tokenizer": "uax_url_email",
"filter": [
"email",
"lowercase",
"unique"
]
}
}
}
},
"mappings": {
"properties": {
"code": {
"type": "long"
},
"date": {
"type": "date"
},
"part": {
"type": "text",
"fields": {
"keyword": {
"type": "keyword",
"ignore_above": 256
}
}
},
"val": {
"type": "long"
},
"email": {
"type": "text",
"analyzer": "email"
}
}
}
}
Вы заметили, что у него есть специальный анализатор email
, который разбивает что-то вроде foo@bar.com
на эти токены:foo@bar.com
, foo
, bar.com
, bar
, com
.
Как сказано в документации, вы можете создать отдельный индекс перколятора, который будет содержать только ваши запросы перколятора, но не документысамих себя. И даже если индекс перколятора не содержит сами документы, он должен содержать отображение индекса, в котором должны храниться документы (в нашем случае test
).
Это отображение перколятораИндекс (который я назвал percolator_index
), который также имеет специальный анализатор, используемый для разделения поля email
:
{
"settings": {
"analysis": {
"filter": {
"email": {
"type": "pattern_capture",
"preserve_original": true,
"patterns": [
"([^@]+)",
"(\\p{L}+)",
"(\\d+)",
"@(.+)",
"([^-@]+)"
]
}
},
"analyzer": {
"email": {
"tokenizer": "uax_url_email",
"filter": [
"email",
"lowercase",
"unique"
]
}
}
}
},
"mappings": {
"properties": {
"query": {
"type": "percolator"
},
"code": {
"type": "long"
},
"date": {
"type": "date"
},
"part": {
"type": "text",
"fields": {
"keyword": {
"type": "keyword",
"ignore_above": 256
}
}
},
"val": {
"type": "long"
},
"email": {
"type": "text",
"analyzer": "email"
}
}
}
}
Его отображение и настройки практически совпадают с моим исходным индексом, единственное отличиеявляясь дополнительным полем query
типа percolator
, добавляемым в отображение.
Интересующий вас запрос - simple_query_string
- должен входить в документ внутри percolator_index
. Вот так:
PUT /percolator_index/_doc/1?refresh
{
"query": {
"simple_query_string" : {
"query" : "month foo@bar.com",
"fields": ["part", "email"]
}
}
}
Чтобы сделать его более интересным, я добавил туда поле email
, которое нужно искать в запросе (по умолчанию все они ищутся).
Теперь цель состоит в том, чтобы протестировать документ, который в конечном итоге должен войти в индекс test
, против этого запроса simple_query_string
из вашего индекса перколятора. Например:
GET /percolator_index/_search
{
"query": {
"percolate": {
"field": "query",
"document": {
"date":"2004-07-31T11:57:52.000Z","part":"month","code":109,"val":0,"email":"foo@bar.com"
}
}
}
}
То, что находится под document
, это, очевидно, ваш будущий (еще не существующий) документ. Это будет сопоставлено с определенным выше simple_query_string
и приведет к совпадению:
{
"hits": {
"total": {
"value": 1,
"relation": "eq"
},
"max_score": 0.39324823,
"hits": [
{
"_index": "percolator_index",
"_type": "_doc",
"_id": "1",
"_score": 0.39324823,
"_source": {
"query": {
"simple_query_string": {
"query": "month foo@bar.com",
"fields": [
"part",
"email"
]
}
}
},
"fields": {
"_percolator_document_slot": [
0
]
}
}
]
}
}
Что если бы я вместо этого перколировал этот документ:
{
"query": {
"percolate": {
"field": "query",
"document": {
"date":"2004-07-31T11:57:52.000Z","part":"month","code":109,"val":0,"email":"foo"
}
}
}
}
(обратите внимание, чтоадрес электронной почты только foo
) Это результат:
{
"hits": {
"total": {
"value": 1,
"relation": "eq"
},
"max_score": 0.26152915,
"hits": [
{
"_index": "percolator_index",
"_type": "_doc",
"_id": "1",
"_score": 0.26152915,
"_source": {
"query": {
"simple_query_string": {
"query": "month foo@bar.com",
"fields": [
"part",
"email"
]
}
}
},
"fields": {
"_percolator_document_slot": [
0
]
}
}
]
}
}
Обратите внимание, что оценка немного ниже, чем у первого перколированного документа. Это, вероятно, так, потому что foo
(мое электронное письмо) соответствует только одному из терминов в моем проанализированном foo@bar.com
, тогда как foo@bar.com
соответствует всем им (таким образом, получая лучший результат)
Неконечно, о каком анализаторе вы говорите. Я думаю, что приведенный выше пример покрывает единственную проблему / неизвестность "анализатора", которая, я думаю, может быть немного запутывающей.