2015-02-04 1 views
0

В нашем 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.

ответ

1

Вам действительно не нужно беспокоиться.

Если у меня нет серьезного мозга, это не изменит ваш результат, потому что условие OR всегда будет соответствовать предыдущей цепочке AND.

+0

Ах, вы действительно правы. Оказывается, наш поиск не удался из-за другой причины. Мы используем поиск списка компаний, и одна из компаний получила название «A & A * something more *». Когда мы вводим поисковый запрос A & A, он не находит его. Я также замечаю, что он также не находит его, когда я просто вводю «&» в качестве поискового запроса, так что проблема в другом месте. Я задам новый вопрос для этого и приму свой ответ для этого. –

+0

[Вот новый вопрос.] (Http://stackoverflow.com/questions/28338943/iravenqueryablet-search-cant-find-sign-or-other-special-characters) –