gpt4 book ai didi

c# - 如何使用 NEST QueryString 并转义特殊字符?

转载 作者:行者123 更新时间:2023-11-30 16:08:40 25 4
gpt4 key购买 nike

我在我的应用程序中使用 NEST 与 Elasticsearch 通信。

在这种情况下,用户输入他们的搜索词 F5503904902 返回正确的结果。但是,如果他们搜索查询 F5503904902-90190F5503904902-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();
}

我会喜欢任何帮助或指示为什么这不起作用或更好的方法来完成它。

最佳答案

在 ElasticSearch 中,破折号和下划线不是特殊字符,但它们是导致术语拆分的字符。重要的是字段上的索引。我建议设置多字段。

https://www.elastic.co/guide/en/elasticsearch/client/net-api/current/multi-fields.html

这是一个例子:

PUT hilden1

PUT hilden1/type1/_mapping
{
"properties": {
"multifield1": {
"type": "string",
"fields": {
"raw": {
"type": "string",
"index": "not_analyzed"
}
}
}
}
}

POST hilden1/type1
{
"multifield1": "hello"
}

POST hilden1/type1
{
"multifield1": "hello_underscore"
}

POST hilden1/type1
{
"multifield1": "hello-dash"
}

让我们尝试找到虚线值:

GET hilden1/type1/_search
{
"query": {
"filtered": {
"filter": {
"term": {
"multifield1": "hello-dash"
}
}
}
}
}

这不会返回任何结果,因为 ES 在幕后将字段分成两部分。但是,因为我们将此字段设置为多字段,所以我们可以根据我们设置的“.raw”查询它。此查询将获得您要查找的结果。

GET hilden1/type1/_search
{
"query": {
"filtered": {
"filter": {
"term": {
"multifield1.raw": "hello-dash"
}
}
}
}
}

关于c# - 如何使用 NEST QueryString 并转义特殊字符?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28857164/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com