Ravendb Полнотекстовый поиск
-
29-09-2019 - |
Вопрос
Можете ли вы рассказать, как выполнить простой текстовый поиск в Ворота. Отказ База данных хранится документ: Фильм {name = "пираты карибского языка"}. Отказ Я желаю, чтобы этот документ был найден в поисковой фразе «Пираты Carribean» или любая другая комбинация слов.
Решение
То, что вы беспокоитесь о том, что нечего делать с полным текстом - по умолчанию Lucene работает на или основе, а что вы хотите, и
Если бы я был тобой, я бы сделал
String[] terms = searchTerm.Split(" "); // Or whatever the string.split method is
и
.Where("Name:(" + String.Join(" AND ", terms) + ")");
Ваш индекс должен выглядеть что-то вроде
public class Movie_ByName : AbstractIndexCreationTask
{
public override IndexDefinition CreateIndexDefinition()
{
return new IndexDefinitionBuilder<Movie>
{
Map = movies => from movie in movies
select new { movie.Name, market.Id },
Indexes =
{
{x => x.Name, FieldIndexing.Analyzed}
}
}
.ToIndexDefinition(DocumentStore.Conventions);
}
Вам не нужно хранить, вы не запрашиваете данные из Луси непосредственно в любое время. Вы можете даже не хотеть индекс (вы действительно можете нужны Fieldindexing.Analyzed, и может уйти с использованием динамических запросов здесь)
До вас, хотя.
Другие советы
Борис, ответ Роб имеет правильный индекс, но это немного неловко для запроса. Вы можете сделать это, используя:
session.Query<Movie, Movie_ByName>()
.Search(x=>x.Name, searchTerms)
.ToList()
Что будет
Вот как я достиг «и будущего» срока поиска.
Во-первых, убедитесь, что ваше поле проиндексировано и проанализировано:
public class MyIndex: AbstractIndexCreationTask<MyDocument>
{
public MyIndex()
{
Map = docs => from d in docs
select new { d.MyTextField };
Index(x => x.MyTextField, FieldIndexing.Analyzed);
}
}
Затем запрос от клиента:
var query = session.Query<MyDocument, MyIndex>();
query = theSearchText
.Split(new[] {" "}, StringSplitOptions.RemoveEmptyEntries)
.Aggregate(query, (q, term) =>
q.Search(x => x.MyTextField, term, options: SearchOptions.And));