Я упросту мою проблему. Допустим, у меня есть индекс с 3 документами, которые я создал с помощью Kibana:
PUT /test/vendors/1
{
"type": "doctor",
"name": "Phil",
"works_in": [
{
"place": "Chicago"
},
{
"place": "New York"
}
]
}
PUT /test/vendors/2
{
"type": "lawyer",
"name": "John",
"works_in": [
{
"place": "Chicago"
},
{
"place": "New Jersey"
}
]
}
PUT /test/vendors/3
{
"type": "doctor",
"name": "Jill",
"works_in": [
{
"place": "Chicago"
}
]
}
Сейчас я запускаю поиск:
GET /test/_search
{
"query": {
"multi_match" : {
"query": "doctor in chicago",
"fields": [ "type", "place" ]
}
}
}
И я получаю хороший ответ:
{
"took": 4,
"timed_out": false,
"_shards": {
"total": 5,
"successful": 5,
"skipped": 0,
"failed": 0
},
"hits": {
"total": 2,
"max_score": 0.2876821,
"hits": [
{
"_index": "test",
"_type": "vendors",
"_id": "1",
"_score": 0.2876821,
"_source": {
"type": "doctor",
"name": "Phil",
"works_in": [
{
"place": "Chicago"
},
{
"place": "New York"
}
]
}
},
{
"_index": "test",
"_type": "vendors",
"_id": "3",
"_score": 0.2876821,
"_source": {
"type": "doctor",
"name": "Jill",
"works_in": [
{
"place": "Chicago"
}
]
}
}
]
}
}
Теперь все становится проблематичным ...
Изменено doctor
на doctors
GET /test/_search
{
"query": {
"multi_match" : {
"query": "doctors in chicago",
"fields": [ "type", "place" ]
}
}
}
Ноль результатов, как doctors
не найдено. Эластик не знает о множественном и единственном числе.
Измените запрос на New York
GET /test/_search
{
"query": {
"multi_match" : {
"query": "doctor in new york",
"fields": [ "type", "place" ]
}
}
}
Но набор результатов ответа дает мне doctor
в Chicago
в дополнение к doctor
в New York
. поля соответствуют OR ...
Другой интересный вопрос: что произойдет, если кто-то использует docs
или physicians
или health professionals
, но означает doctor
. Есть ли положение, в котором я могу научить Elasticsearch направлять их в "доктора"?
Есть ли какая-то закономерность, позволяющая обойтись без них только с помощью Центрального поиска? где мне не придется анализировать строку на предмет смысла в моем собственном приложении, которое затем построит сложный точный запрос эластичного поиска, чтобы соответствовать ему?
Буду признателен за указатель в правильном направлении