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

我正在使用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();
}

我很乐意提供任何帮助或指示,以了解为什么这不起作用或实现此目的的更好方法.

解决方法:

在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"
        }
      }
    }
  }
}
上一篇:【Nest教程】Nest项目配置http和https


下一篇:【Nest教程】Nest项目集成JWT接口认证