Я пытаюсь заставить поиск с пробелами работать правильно в elasticsearch, но у меня много проблем с тем, чтобы заставить его вести себя так же, как и в другом поле.
У меня есть два поля, Name
и Addresses.First().Line1
, в которых я хочу иметь возможность искать и сохранять пробелы в поиске. Например, поиск Bob Smi*
вернет Bob Smith
, а не только Bob
.
Это работает для моего поля имени, выполняя поиск строки запроса с заменой пробела на ?
. Я также использую подстановочный знак, поэтому мой последний запрос — *bob?smi*
.
Однако, когда я пытаюсь выполнить поиск по строке 1, я не получаю результатов. Например. *4800*
возвращает запись со строкой 1, например 4800 Street
, но когда я делаю то же преобразование с 4800 street
, чтобы получить *4800?street*
, я не получаю никаких результатов.
Ниже мой запрос
{
"from": 0,
"size": 50,
"query": {
"bool": {
"must": [
{
"query_string": {
"query": "*4800?Street*",
"fields": [
"name",
"addresses.line1"
]
}
}
]
}
}
}
не возвращает никакого результата.
Почему *bob?smi*
возвращает результат с именем Bob Smith
, а *4800?street*
не возвращает результат с позицией 4800 street
?
Ниже показано, как оба поля настроены в индексе:
.Text(smd => smd.Name(c => c.Name).Analyzer(ElasticIndexCreator.SortAnalyzer).Fielddata())
.Nested<Address>(nomd => nomd.Name(p => p.PrimaryAddress).Properties(MapAddressProperties))
//from MapAddressProperties()
.Text(smd2 => smd2.Name(x => x.Line1).Analyzer(ElasticIndexCreator.SortAnalyzer).Fielddata())
Сопоставления в эластике:
"name": {
"type": "text",
"fields": {
"keyword": {
"type": "keyword",
"ignore_above": 256
}
}
}
}
"addresses": {
"line1": {
"type": "text",
"fields": {
"keyword": {
"type": "keyword",
"ignore_above": 256
}
}
},
}
Есть ли другой, лучший способ избежать пробела в строке запроса elasticsearch? Я также пробовал \\
и \\\\
(в С# оценивается как \\
) вместо ?
безрезультатно.
?
? Для справки, чтобы искать4800 street
именно так, как вы его видите, вам нужно использовать"query": "\"4800 street\""
. Двойные кавычки, окружающие текст, чтобы он искался точно так же. - person Andrei Stefan   schedule 25.01.2018*bob?smi*
, какой именно запрос и документ соответствуют? Потому что приведенные вами примеры -name
изBob Smith
и поиск*bob?smi*
НЕ вернут совпадение. - person Andrei Stefan   schedule 25.01.2018query_string
вернут что-то, если вы будете искать"query": "*Bob?Smi*"
внутриname.keyword
. - person Andrei Stefan   schedule 25.01.2018"\"4800 street\""
вернул результаты того же типа, некоторые для4800
некоторые дляstreet
- person DLeh   schedule 25.01.2018*abc?company*
возвращает результат с именемABC Company
.?
предназначен для замены любого персонажа и, кажется, отлично работает для поля имени - person DLeh   schedule 25.01.2018gist
, демонстрирующий, что"\"4800 street\""
соответствуетaddress.line1: street
. - person Andrei Stefan   schedule 25.01.2018name
дает правильные результаты, когда в запросе есть пробелы, а поиск в полеaddresses.line1
— нет. Должна быть какая-то разница в том, как эти поля создаются или интерпретируются, но я не могу найти доказательств того, что такая разница существует. - person DLeh   schedule 25.01.2018curl
запроса, который получает кластер ES, а не то, что делает ваш код. - person Andrei Stefan   schedule 25.01.2018gist
, как вы упомянули? - person DLeh   schedule 31.01.2018