我正在使用这样的查询:
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
答案 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*
。