Я новичок в эластичном поиске, и я пытался использовать подсказку завершения эластичного поиска, используя Nest для автозаполнения свойства.
Вот мое сопоставление (как уже упоминалось здесь: ):
var createResult = client.CreateIndex(indexName, index => index
.AddMapping<Contact>(tmd => tmd
.Properties(props => props
.Completion(s =>
s.Name(p => p.CompanyName.Suffix("completion"))
.IndexAnalyzer("standard")
.SearchAnalyzer("standard")
.MaxInputLength(20)
.Payloads()
.PreservePositionIncrements()
.PreserveSeparators())
)
)
);
var resultPerson = client.IndexMany(documents.OfType<Person>(), new SimpleBulkParameters { Refresh = true });
var resultCompany = client.IndexMany(documents.OfType<Company>(), new SimpleBulkParameters { Refresh = true });
И во время индексации я просто использую метод IndexMany
и передаю IEnumberable<Contact>
(у контакта есть свойство по имени CompanyName, контакт является абстрактным классом, и Person, и Company являются его конкретными реализациями). Поиск выдает исключение с сообщением ElasticSearchException[Field [companyName] не является полем для предложения завершения]. И запрос выглядит следующим образом:
SearchDescriptor<Contact> descriptor = new SearchDescriptor<Contact>();
descriptor = descriptor.SuggestCompletion("suggest", c => c.OnField(f => f.CompanyName).Text(q));
var result = getElasticClientInstance("contacts").Search<Contact>(body => descriptor);
string qe = result.ConnectionStatus.ToString();
Что я здесь делаю неправильно, я просмотрел тесты Nest на SuggestCompletion
, но не очень помог, то есть тест показывает только то, как получать предложения, но не то, как устанавливать сопоставления индексов для SuggestCompletion.
Я также попытался настроить токенизатор edgeNgram
, как указано в этом опубликовать, но не смог продолжить и там.
Любое направление или пример того, как действовать, очень помогут.