elasticsearch,nest,C#,elasticsearch,Nest" /> elasticsearch,nest,C#,elasticsearch,Nest" />

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

C# 如何使用NEST QueryString并转义特殊字符?,c#,elasticsearch,nest,C#,elasticsearch,Nest,我在应用程序中使用NEST与Elasticsearch通信 在这种情况下,用户在搜索词中输入F5503904902,返回正确的结果。但是,如果他们搜索查询F5503904902-90190或F5503904902-9019055f,结果不会返回 我认为这是因为特殊的字符,所以我试图逃避他们-但随后也没有结果回来。我的问题正确吗?我做错什么了吗另外我在转义查询的末尾添加了一个通配符,以匹配任何开放式查询 搜索方法: public IPagedSearchResult<MyFileObject

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

在这种情况下,用户在搜索词中输入
F5503904902
,返回正确的结果。但是,如果他们搜索查询
F5503904902-90190
F5503904902-9019055f
,结果不会返回

我认为这是因为特殊的字符,所以我试图逃避他们-但随后也没有结果回来。我的问题正确吗?我做错什么了吗另外我在转义查询的末尾添加了一个通配符,以匹配任何开放式查询

搜索方法:

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();
}
公共IPagedSearchResult查找(ISearchQuery) { ElasticClient=ElasticClientManager.GetClient(_indexCluster,ElasticSearchIndexName.MyFileObjects); 字符串queryString=EscapeSearchQuery(query.query)+“*”; var searchResults=client.Search(s=>s .From(query.Skip) .Size(query.Take) .QueryString(QueryString)); IPagedSearchResult pagedSearchResult=新的pagedSearchResult(); pagedSearchResult.Results=搜索结果.Documents; pagedSearchResult.Skip=query.Skip; pagedSearchResult.Take=query.Take; pagedSearchResult.Total=Convert.ToInt32(searchResults.Total); 返回pagedSearchResult; } 转义方法:

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();
}
私有字符串转义搜索查询(字符串查询)
{
if(String.IsNullOrWhiteSpace(query))返回查询;
//&&| |这里不处理

ElasticSearch中的char[]special={'+'、'-'、'='、'>'、',破折号和下划线不是特殊字符,但它们是导致术语拆分的字符。重要的是字段上的索引。我建议设置多字段

以下是一个例子:

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"
        }
      }
    }
  }
}