В настоящее время я строю поиск контактов для системы на основе php и mysql. Все данные, которые должны быть доступными для поиска, синхронизируются вasticsearch, и документы выглядят так:
{
"_index": "persons",
"_type": "person",
"_id": "705",
"_version": 1,
"_score": 1,
"_source": {
"firstname": "Jaida",
"lastname": "Walter",
"id": 705,
"title": "Miss",
"nickname": "",
"gender": "female",
"birthday": "1992-12-29",
"companies": [
"Mann, Bailey and Hills",
"West PLC",
"Keebler-Howe",
"Hills LLC",
"Toy, Gusikowski and Mohr",
"Halvorson-Fadel",
"Ratke PLC",
"Turcotte-Franecki",
"Bernier-Flatley",
"Wisozk, Bernhard and Osinski"],
"emailAddresses": [ ],
"addresses": [
"Doe Street 47, 07691 JaneVille",
"Doe Street 78, 84294 JaneVille",
"Doe Street 37, 31698 JohnVille",
"Doe Street 54, 62462 JaneVille",
"Doe Street 31, 37672 JohnVille"],
"phoneNumbers": [ ]
}
}
Теперь я хотел бы позволить пользователю выполнять поиск по всем этим полям, а также использовать частичные слова в своем запросе. Я повторно изучил эту тему и нашел фильтр Ngram. Я попытался реализовать все с помощью документации и некоторых постов в блоге. В настоящее время я использую следующие настройки индекса:
$params = [
'index' => SearchPerson::getIndex(),
'body' => [
'settings' => [
"analysis" => [
"analyzer" => [
"ngram_analyzer" => [
"type" => "custom",
"tokenizer" => "whitespace",
"filter" => ["asciifolding", "lowercase", "ngram"]
],
"whitespace_analyzer" => [
"type" => "custom",
"tokenizer" => "whitespace",
"filter" => [
"lowercase",
"asciifolding"]
]
],
"filter" => [
"ngram" => [
"type" => "ngram",
"min_gram" => 2,
"max_gram" => 20,
"token_chars" => [
"letter",
"digit",
"punctuation",
"symbol"]
]
]
]
],
'mapping' => [
'person' => [
'_all' => [
'analyzer' => 'ngram_analyzer',
'search_analyzer' => 'whitespace_analyzer'
],
'properties' => [
'firstname' => [
'analyzer' => 'ngram_analyzer',
'search_analyzer' => 'whitespace_analyzer'
]
]
]
]
]
];
К сожалению, когда я запрашиваю индекс, я всегда получаю один и тот же документ взамен, который я не собирался найти.
Изменить 1:
Это мой запрос:
{
"size": 10,
"query": {
"match": {
"_all": {
"query": "Terill",
"minimum_should_match": "100%"}
}
}
}
Я также попытался запросить различные поля (например, имя) и удалил «imum_should_match ».
В результате я получил следующий документ:
{
"_index": "persons",
"_type": "person",
"_id": "701",
"_version": 1,
"_score": 1,
"_source": {
"firstname": "Austen",
"lastname": "Braun",
"id": 701,
"title": "Mr.",
"nickname": "",
"gender": "male",
"birthday": "2008-05-15",
"companies": [
"Abshire, Fadel and Kiehn",
"Wolf-Bogan",
"Kohler-Langosh",
"Howe, Skiles and Boyer",
"Rippin, Batz and Ondricka",
"Gislason-Kirlin"],
"emailAddresses": [ ],
"addresses": [
"Doe Street 68, 28012 JaneVille",
"Doe Street 12, 78992 JohnVille",
"Doe Street 23, 75805 JaneVille",
"Doe Street 95, 46066 JohnVille",
"Doe Street 72, 28754 JohnVille"],
"phoneNumbers": [ ]
}
}
Но с вышеупомянутым поисковым запросом я ищу этот:
{
"_index": "persons",
"_type": "person",
"_id": "712",
"_version": 1,
"_score": 1,
"_source": {
"firstname": "Terrill",
"lastname": "Parker",
"id": 712,
"title": "Mr.",
"nickname": "",
"gender": "male",
"birthday": "1970-07-12",
"companies": [
"Abshire, Fadel and Kiehn",
"Zemlak Ltd",
"McDermott, Schuppe and Mayer",
"Ledner, Rosenbaum and Maggio",
"Schoen PLC",
"Hills LLC",
"Tromp, Abernathy and Kuvalis",
"Toy, Gusikowski and Mohr",
"Hyatt-Flatley",
"Rippin, Batz and Ondricka",
"Jenkins-Corwin",
"Ratke PLC"],
"emailAddresses": [
"[email protected]",
"[email protected]"],
"addresses": [
"Doe Street 31, 35283 JaneVille",
"Doe Street 78, 46721 JohnVille",
"Doe Street 48, 39953 JohnVille",
"Doe Street 24, 31388 JohnVille",
"Doe Street 84, 35932 JohnVille"],
"phoneNumbers": [
"747-058-484",
"027-478-036"]
}
}
Изменить 2:
я нашел этот документ заявляя, что произошли изменения в отображениях анализатора. Я обновил свои сопоставления, но все еще получаю те же результаты. Также я создал суть для проблемы.
Задача ещё не решена.
Других решений пока нет …