В нашем RavenQueryableExtensions
классе мы имеем следующий метод:IRavenQueryable <T> для обоих космических расщепляется поисковыми терминами и полного поиска строки в целом
public static IRavenQueryable<T> SearchMultiple<T>(this IRavenQueryable<T> self,
Expression<Func<T, object>> fieldSelector, string queries,
decimal boost = 1, SearchOptions options = SearchOptions.Or)
{
if (String.IsNullOrEmpty(queries)) throw new ArgumentNullException("queries");
// All gabs of more than a single space (like tabs, two spaces, etc.)
// are reduced to a single space
var newQueries = Regex.Replace(queries, @"\s{2,}", " ");
//newQueries = SyncShared.ReplacePostcode(newQueries); // not important for this question
// The complete search-string is splitted into seperated search-terms
var searchValues = newQueries.Split(' ');
return self.SearchMultiple(fieldSelector, searchValues, boost, options);
}
public static IRavenQueryable<T> SearchMultiple<T>(this IRavenQueryable<T> self,
Expression<Func<T, object>> fieldSelector, IEnumerable<string> queries,
decimal boost = 1, SearchOptions options = SearchOptions.Or)
{
if (queries == null) throw new ArgumentNullException("queries");
return queries.Aggregate(self, (current, query) => current.Search(fieldSelector, query + "* ", boost, options, EscapeQueryOptions.AllowPostfixWildcard));
}
который создает поисковую-запрос со всеми рыхлой поисково- терминов в массиве searchValues и параметре SearchOptions
. Если бы это всегда было SearchOptions.Or
, я мог бы просто добавить полную строку поиска к этому массиву, и все будет хорошо, но поскольку мы также иногда используем параметр SearchOptions.And
, у меня возникла проблема.
Что я хочу - это либо все результаты, которые соответствуют всем индивидуальным условиям поиска, объединенным, так и полному поисковому сроку в целом.
Например: Допустим, у меня есть следующий термин поиска: "This is a search term"
- Сейчас мы получим следующий запрос:
"This" AND "is" AND "a" AND "search" AND "term"
- То, что я хочу вместо этого, однако это:
("This" AND "is" AND "a" AND "search" AND "term") OR "This is a search term"
Проблема в основном заключается в том, что мы используем виртуальные и динамические запросы для нескольких классов, иначе мы, скорее всего, просто добавим полный поисковый термин в Map-Index, например, в this SO-answer.
Ах, вы действительно правы. Оказывается, наш поиск не удался из-за другой причины. Мы используем поиск списка компаний, и одна из компаний получила название «A & A * something more *». Когда мы вводим поисковый запрос A & A, он не находит его. Я также замечаю, что он также не находит его, когда я просто вводю «&» в качестве поискового запроса, так что проблема в другом месте. Я задам новый вопрос для этого и приму свой ответ для этого. –
[Вот новый вопрос.] (Http://stackoverflow.com/questions/28338943/iravenqueryablet-search-cant-find-sign-or-other-special-characters) –