在RavenDB中使用空格键搜索的子字符串

时间:2012-09-06 10:52:00

标签: linq lucene.net ravendb

我正在使用这样的查询:

var query = "*" + QueryParser.Escape(input) + "*";
session.Query<User, UsersByEmailAndName>().Where(x => x.Email.In(query) || x.DisplayName.In(query));

在简单索引的支持下:

public UsersByEmailAndName()
{
    Map = users => from user in users
                   select new
                          {
                              user.Email,
                              user.DisplayName,
                          };            
}

Here我读过:

  

“默认情况下,RavenDB使用一个名为的自定义分析器   所有内容的LowerCaseKeywordAnalyzer。 (...)的默认值   每个字段都是Stores中的FieldStorage.No和中的FieldIndexing.Default   索引“。

索引包含字段:

DisplayName - "jarek waliszko"电子邮件 - "my_email@domain.com"

最后的事情是:

如果query类似*_email@**ali*,结果就可以了。但是我在内部使用空格键。 *ek wa*,不返回任何内容。为什么以及如何解决它?

顺便说一下:我正在使用RavenDB - Build#960

3 个答案:

答案 0 :(得分:3)

将要搜索的字段的“索引”选项更改为“已分析”,而不是“默认” 另外,看看这里: http://ayende.com/blog/152833/orders-search-in-ravendb

答案 1 :(得分:1)

所以..,我想出了如何做到这一点的想法。我不知道这是“正确的方式”,但它对我有用。

查询更改为:

var query = string.Format("*{0}*", Regex.Replace(QueryParser.Escape(input), @"\s+", "-"));

索引更改为:

public UsersByEmailAndName()
{
    Map = users => from user in users
                   select new
                          {
                              user.Email,
                              DisplayName = user.DisplayName.Replace(" ", "-"),
                          };
}

我刚刚将空格变为短划线,用户输入文本和空格键在索引显示名称中为短划线。该查询现在给出了预期的结果。没有其他任何改变,我仍然像以前一样使用LowerCaseKeywordAnalyzer。

答案 2 :(得分:1)

Lucene的查询解析器将搜索词中的空格解释为实际查询中的中断,并且不在搜索中包含它。 在空格之后出现的搜索词的任何部分也被忽略。

所以你应该通过在空白字符之前加上反斜杠字符来转义空格字符。 尝试查询*jarek\ waliszko*