Я использую 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();
}
Я хотел бы получить любую помощь или указатели, почему это не работает, или лучшие способы сделать это.