3

我正在使用这样的查询:

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,
                          };            
}

在这里,我读过:

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

该索引包含以下字段:

显示名称-"jarek waliszko"电子邮件-"my_email@domain.com"

最后是:

如果query是类似的东西*_email@**ali*结果很好。但是,当我在 eg 中使用空格键时*ek wa*,没有返回任何内容。为什么以及如何解决它?

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

4

3 回答 3

3

更改您要搜索以进行分析的字段的索引选项,而不是默认选项另外,请查看此处: http ://ayende.com/blog/152833/orders-search-in-ravenb

于 2012-09-07T00:20:39.707 回答
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。

于 2012-09-06T14:25:42.427 回答
1

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

So you should escape space character by prepending the backslash character before whitespace character. Try to query *jarek\ waliszko*.

于 2013-05-03T11:11:38.313 回答