Вы можете добавить match_phrase_prefix query в свое поле.
Match_phrase_prefix возьмет последний токен в вашем поисковом запросе и выполнит сопоставление префикса фразы на нем. Порядок токенов важен. Если вы хотите искать в любом месте текста, вам нужно будет создать n-граммов и edge_grams для токенов
var searchResults = _elasticClient.Search<ProjectModel>(
body => body.Query(
query => query.Bool(
bq => bq.Should(
q=> q.MatchPhrasePrefix(p=>p.Field(f=>f.name).Query(keyword)) --> note
q => q.Match(p => p.Field(f => f.name).Boost(6).Query(keyword)),
q => q.MatchPhrasePrefix(p => p.Field(f => f.description).Boost(6).Query(keyword)),
sh => sh.Nested(n => n.Path(p => p.taskmodels).Query(nq => nq.Match(
m => m.Query(keyword).Field("taskmodels.description")
)
)
),
sh => sh.Nested(n => n.Path(p => p.taskmodels).Query(nq => nq.Match(
m => m.Query(keyword).Field("taskmodels.title")
)
)
)
)
)
).Size(MAX_RESULT)
);
Различных между match, matchphrase и matchphraseprefix
Предположим, существует документ с полем «описание»: «наука и технология». Этот текст разбит на отдельные токены [«наука», «и», «технология»] и занесен в инвертированный индекс.
Если если вы хотите найти "наука о технологиях", вы можете использовать поисковый запрос. Порядок совпадения слов не имеет значения, поэтому вы также получите документ при поиске по запросу «наука о технологиях». Он просто сопоставляет токены.
Если порядок важен для вас, тогда используйте match_phrase «наука и технологии», только вернет документ.
Если вы хотите найти частичное предложение «наука и техника», тогда используйте match_phrase_prefix. Сопоставление префикса выполняется только для последнего токена, поэтому вы не можете искать «s cie and techno». Для этого есть другие опции, такие как граничные и графические