Подскажите, пожалуйста, как выполнить простой полнотекстовый поиск в RavenDb. В базе данных хранится документ: Фильм {Name = "Пираты Карибского моря"}. Я хочу, чтобы этот документ был найден по поисковой фразе «Пираты Карибского моря» или любому другому сочетанию слов.
Полнотекстовый поиск RavenDB
Ответы (3)
То, о чем вы беспокоитесь, не имеет ничего общего с полным текстом - по умолчанию 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);
}
Вам не нужно хранилище, вы не запрашиваете данные непосредственно у Lucene в любое время. Возможно, вам даже не нужен индекс (на самом деле вам может понадобиться FieldIndexing.Analyzed, и вы можете просто использовать здесь динамические запросы)
Впрочем, решать вам.
person
Rob Ashton
schedule
01.12.2010
Или searchTerm.Replace( , AND ), хотя, возможно, вам следует опасаться пустых записей и всего такого.
- person Rob Ashton; 01.12.2010
Рынки/рыночный текст случайно не остался от копипаст?
- person Adam Cooper; 01.12.2010
Да, я использовал другой вопрос в качестве примера
- person Rob Ashton; 02.12.2010
Откуда взялась переменная фильмов?
- person Christophe Debove; 07.11.2012
Борис, ответ Роба имеет правильный индекс, но это немного неудобно для запросов. Вы можете сделать это, используя:
session.Query<Movie, Movie_ByName>()
.Search(x=>x.Name, searchTerms)
.ToList()
Что будет
person
Ayende Rahien
schedule
27.11.2011
@RonnieOverby И в этот момент его съел медведь.
- person ehdv; 15.03.2012
Вот как я добился поиска по термину «И».
Во-первых, убедитесь, что ваше поле проиндексировано и проанализировано:
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));
person
Ronnie Overby
schedule
22.12.2012