【发布时间】:2015-05-05 14:25:44
【问题描述】:
我在我的应用程序中使用 NEST 与 Elasticsearch 进行通信。
在这种情况下,用户输入他们的搜索词 F5503904902 会返回正确的结果。但是,如果他们搜索查询 F5503904902-90190 或 F5503904902-90190_55F,则不会返回结果。
我认为这是因为特殊字符,所以我试图转义它们 - 但结果也没有返回。我的查询是否正确,我做错了什么? 另外我将一个通配符附加到转义查询的末尾以匹配任何开放式结尾。
搜索方式:
public IPagedSearchResult<MyFileObject> Find(ISearchQuery query)
{
ElasticClient client = ElasticClientManager.GetClient(_indexCluster, ElasticSearchIndexName.MyFileObjects);
string queryString = EscapeSearchQuery(query.Query) + "*";
var searchResults = client.Search<MyFileObject>(s => s
.From(query.Skip)
.Size(query.Take)
.QueryString(queryString));
IPagedSearchResult<MyFileObject> pagedSearchResult = new PagedSearchResult<MyFileObject>();
pagedSearchResult.Results = searchResults.Documents;
pagedSearchResult.Skip = query.Skip;
pagedSearchResult.Take = query.Take;
pagedSearchResult.Total = Convert.ToInt32(searchResults.Total);
return pagedSearchResult;
}
转义方法:
private string EscapeSearchQuery(string query)
{
if (String.IsNullOrWhiteSpace(query)) return query;
//&& || not handled here
char[] special = { '+', '-', '=', '>', '<', '!', '(', ')', '{', '}', '[', ']', '^', '\"', '~', '*', '?', ':', '\\', '/', ' ' };
char[] qArray = query.ToCharArray();
StringBuilder sb = new StringBuilder();
foreach (var chr in qArray)
{
if (special.Contains(chr))
{
sb.Append(String.Format("\\{0}", chr));
}
else
{
sb.Append(chr);
}
}
return sb.ToString();
}
我希望得到任何帮助或指示为什么这不起作用或更好的方法来实现这一点。
【问题讨论】:
标签: c# elasticsearch nest