【问题标题】:IRavenQueryable<T> for both space-splitted search-terms and complete search-string as wholeIRavenQueryable<T> 用于空间分割的搜索词和完整的搜索字符串
【发布时间】:2015-04-04 04:01:58
【问题描述】:

在我们自己的RavenQueryableExtensions 类中,我们有以下方法:

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-array 和 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"

问题主要在于我们对多个类使用虚拟和动态查询,否则我们很可能只是将完整的 Search-term 添加到 Map-Index 中,如 this SO-answer

【问题讨论】:

    标签: c# search full-text-search ravendb iqueryable


    【解决方案1】:

    你真的不需要打扰。

    除非我有严重的脑残,否则它不会改变您的结果,因为 OR 条件将始终与前面的 AND 链匹配。

    【讨论】:

    • 啊,你确实是对的。事实证明,我们的搜索失败是因为不同的原因。我们使用搜索公司列表,其中一家公司的名称为“A & A something more”。当我们输入搜索词 A & A 时,它没有找到它。我也只是注意到,当我输入“&”作为搜索词时,它也找不到它,所以问题似乎出在其他地方。我将为此提出一个新问题并接受您对此的回答。
    猜你喜欢
    • 1970-01-01
    • 2019-02-12
    • 1970-01-01
    • 1970-01-01
    • 2021-03-31
    • 2012-12-27
    • 2012-10-23
    • 2020-02-15
    • 2013-09-15
    相关资源
    最近更新 更多