У меня есть эластичная поисковая база данных с 3,3 миллионами записей в ней. Когда я запускаю такой поиск
elasticClient.Search<ElasticIndex>(s => s.Size(100).From(0).Query(q =>
q.MatchPhrasePrefix(f => f.OnField(i => i.Search).Query("a.b.c.d.e.f")))).Total
Я получаю 27 результатов, чего я и ожидаю. Когда я запускаю запрос, подобный этому
elasticClient.Search<ElasticIndex>(s => s.Size(100).From(0).Query(q =>
q.MatchPhrasePrefix(f => f.OnField(i => i.Search).Query("a.b.c")))).Total
Я получаю 2133 результатов, что я и ожидаю. Но когда я запускаю такой запрос,
elasticClient.Search<ElasticIndex>(s => s.Size(100).From(0).Query(q =>
q.MatchPhrasePrefix(f => f.OnField(i => i.Search).Query("a.b.c")) &&
q.MatchPhrasePrefix(f => f.OnField(i => i.Search).Query("a.b.c.d.e.f")))).Total
Я получаю 0 результатов. Я ожидаю получить 27, которые a.b.c.d.e.f получил как a.b.c, это просто подстрока a.b.c.d.e.f.
Что еще более странно для меня, это то, что если я возьму 27 документов и скопирую их в свой собственный индекс, а затем выполню запрос, он вернет ожидаемые 27 результатов. Если я начну перемещать документы из большого индекса в новый, где-то от 50 000 до 80 000 документов, запрос начнет давать меньше результатов. Если я продолжу копировать документы, запрос продолжит возвращать меньше, пока не вернет 0, но при запросе MatchPrasePrefix (a.b.c или a.b.c.d.e.f) все еще будут возвращаться правильные результаты, только && из 2 возвращает неправильные результаты.
Я понимаю, что запросы для abc и abcdef бесполезны, и я мог бы просто выполнить abcdef, но мои конечные пользователи выполняют поиск, подобный этому, и хотели бы, чтобы он работал, не анализируя входящий поиск и пытаясь найти избыточные термины и удалите затем перед отправкой в базу данных. Я чувствую, что должна быть опция тайм-аута, которую я пропускаю или что-то в этом роде. Любая помощь приветствуется.
Вот эластичный поисковый запрос json. Просто a.b.c.d.e.f
{
"from": 0,
"size": 100,
"query": {
"match": {
"search": {
"type": "phrase_prefix",
"query": "a.b.c.d.e.f"
}
}
}
}
С обоими
{
"from": 0,
"size": 100,
"query": {
"bool": {
"must": [
{
"match": {
"search": {
"type": "phrase_prefix",
"query": "a.b.c.d.e.f"
}
}
},
{
"match": {
"search": {
"type": "phrase_prefix",
"query": "a.b.c"
}
}
}
]
}
}
}