当前位置: 首页 > 面试题库 >

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

许毅
2023-03-14
问题内容

我正在使用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/zh-CN/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"
        }
      }
    }
  }
}


 类似资料:
  • 正如我们所看到的,一个反斜杠 "\" 是用来表示匹配字符类的。所以它是一个特殊字符。 还存在其它的特殊字符,这些字符在正则表达式中有特殊的含义。它们可以被用来做更加强大的搜索。 这里是包含所有特殊字符的列表:[ \ ^ $ . | ? * + ( )。 现在并不需要尝试去记住它们 —— 当我们分别处理其中的每一个时,你自然而然就会记住它们。 转义 如果要把特殊字符作为常规字符来使用,只需要在它前面

  • 问题内容: 我们为科学应用程序提供了一个带有较长段落的表格,其中包含诸如符号beta(ß-arrestin)等字符。我们在Mule上运行一个JSON服务,该服务获取数据并持久保存到oracle数据库中。这个带有长段的特殊元素给我RAML / JSON错误。下面是错误 科学家写下的形式元素我们无法控制。因此,在M子方面,我们如何像Java具有URLEncoded一样自动地转义这些字符。非常感谢 问题

  • 我们有一个表单,其中有一个很长的段落,用于包含符号beta(ß-arrestin)等字符的Scientific应用程序。我们有一个在Mule上运行的JSON服务,它获取数据并保存到oracle数据库。这个带有长段落的特殊元素在RAML/JSON中给了我一个错误。下面是错误 科学家们所写的形式元素我们无法控制。因此,在骡子方面,我们如何像java那样自动摆脱这些角色呢。非常感谢

  • 问题内容: 我想电视机1 ® 2的outputText: 什么不对?我大写。 问题答案: 您可以选择以下之一 在您最初的建议中,您放错了位置,应该在 您也可以完全删除(但您的(R)不会很小) 最后,您可以直接使用它而无需转义

  • 问题内容: 有没有一种方法可以将字符串转换为可以在Web文档中正确显示的字符串?例如,更改字符串 至 问题答案: 具有专门为此设计的功能: http://commons.apache.org/proper/commons- lang/javadocs/api-3.1/org/apache/commons/lang3/StringEscapeUtils.html

  • 我有一个函数,我在其中创建一个Node并将其text Content设置为一个特殊字符,例如项目符号(•)。这个函数在xsl: Application-template中调用。但是,输出转义了特殊caracter,而不是看到项目符号,出现在我的结果中。在做了一些研究后,我还没有找到任何方法来禁用从我的节点转义。我的论点是创建的节点是一个CDATA部分,但我如何恢复它? 这是我用来创建节点的代码: