Вы можете выполнить поиск подстроки по нескольким полям, используя следующий подход:
(1)
public class IdeaByBodyOrTitle : AbstractIndexCreationTask<Idea>
{
public IdeaByBodyOrTitle()
{
Map = ideas => from idea in ideas
select new
{
idea.Title,
idea.Body
};
}
}
на этом сайте вы можете проверить, что:
"По умолчанию RavenDB использует собственный анализатор, который называется
LowerCaseKeywordAnalyzer для всего контента. (...) Значения по умолчанию для
каждое поле FieldStorage.No в магазинах и FieldIndexing.Default в
Индексы ".
Таким образом, по умолчанию, если вы проверяете условия индекса в клиенте raven, это выглядит следующим образом:
Title Body
------------------ -----------------
"the idea title 1" "the idea body 1"
"the idea title 2" "the idea body 2"
На основании этого может быть построен шаблонный запрос:
var wildquery = string.Format("*{0}*", QueryParser.Escape(query));
, который затем используется с конструкциями .In
и .Where
(с использованием оператора OR внутри):
var ideas = session.Query<User, UsersByDistinctiveMarks>()
.Where(x => x.Title.In(wildquery) || x.Body.In(wildquery));
(2)
В качестве альтернативы, вы можете использовать чистый запрос lucene:
var ideas = session.Advanced.LuceneQuery<Idea, IdeaByBodyOrTitle>()
.Where("(Title:" + wildquery + " OR Body:" + wildquery + ")");
(3)
Вы также можете использовать выражение .Search
, но вы должны создать свой индекс по-разному, если вы хотите искать по нескольким полям:
public class IdeaByBodyOrTitle : AbstractIndexCreationTask<Idea, IdeaByBodyOrTitle.IdeaSearchResult>
{
public class IdeaSearchResult
{
public string Query;
public Idea Idea;
}
public IdeaByBodyOrTitle()
{
Map = ideas => from idea in ideas
select new
{
Query = new object[] { idea.Title, idea.Body },
idea
};
}
}
var result = session.Query<IdeaByBodyOrTitle.IdeaSearchResult, IdeaByBodyOrTitle>()
.Search(x => x.Query, wildquery,
escapeQueryOptions: EscapeQueryOptions.AllowAllWildcards,
options: SearchOptions.And)
.As<Idea>();
Резюме:
Также имейте в виду, что *term*
довольно дорого, особенно символ подстановки. В этом сообщении вы можете найти больше информации об этом. Говорят, что ведущий символ подстановки заставляет lucene выполнить полное сканирование индекса и, таким образом, может существенно снизить производительность запросов. Lucene внутренне хранит свои индексы (фактически термины строковых полей), отсортированные в алфавитном порядке и «читает» слева направо. По этой причине поиск по конечному шаблону выполняется быстро, а по лидирующему медленнее.
Таким образом, в качестве альтернативы можно использовать x.Title.StartsWith("something")
, но это, очевидно, не для поиска по всем подстрокам. Если вам нужен быстрый поиск, вы можете изменить параметр «Индекс» для полей, по которым вы хотите выполнить поиск, для анализа, но он снова не будет искать по всем подстрокам.
Если внутри запроса подстроки есть пробел , пожалуйста, проверьте этот вопрос для возможного решения.
Для внесения предложений отметьте http://architects.dzone.com/articles/how-do-suggestions-ravendb.