【问题标题】:Elasticsearch : Search with special character Open & Close parenthesesElasticsearch:使用特殊字符打开和关闭括号搜索
【发布时间】:2019-08-02 07:03:25
【问题描述】:

您好,我正在尝试在弹性搜索中搜索包含这些字符的单词 '(' , ')'。我无法获得预期的结果。

这是我正在使用的查询

{
"query": {
    "query_string" : {
        "default_field" : "name",
        "query" : "\\(Pas\\)ta\""
    }
}}

在结果中,我首先获得了“PASTORS”、“PAST”、“PASCAL”、“PASSION”的记录。 我想在搜索结果的第一条记录中获得名称“Pizza & (Pas)ta”,因为它是最佳匹配

这是模式中名称字段的分析器

"analysis": {
  "filter": {
    "autocomplete_filter": {
      "type": "edge_ngram",
      "min_gram": "1",
      "max_gram": "20"
    }
  },
  "analyzer": {
    "autocomplete": {
      "type": "custom",
      "tokenizer": "standard",
      "filter": [
        "lowercase",
        "autocomplete_filter"
      ]
    }
  }

 "name": {
        "analyzer": "autocomplete",
        "search_analyzer": "standard",
        "type": "string"
   },

请帮我解决这个问题,谢谢

【问题讨论】:

    标签: elasticsearch elasticsearch-query


    【解决方案1】:

    您使用了standard 标记器,它正在从生成的标记中删除()。而不是获取令牌(pas)ta 生成的令牌之一是pasta,因此您无法匹配(pas)ta

    您可以使用whitespace 标记器代替standard 标记器,它将保留名称中的所有特殊字符。将分析器定义更改为以下:

      "analyzer": {
        "autocomplete": {
          "type": "custom",
          "tokenizer": "whitespace",
          "filter": [
            "lowercase",
            "autocomplete_filter"
          ]
        }
      }
    

    【讨论】:

    • 谢谢! @Nishant Saini 如果我将标记器从标准更改为空格,是否还有其他副作用,有没有办法在不更改架构的情况下在查询中传递分析器
    • 两者是不同的 whitespace 基于空间的分词,而 standard 分词提供基于语法的分词。您可以在查询中传递分析器,但这无济于事,因为它将应用于查询的输入字符串
    • 我将标记器转换为空白,是因为 ""search_analyzer": "standard" ,如果是这样如何解决这个问题
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-10-11
    • 2011-06-08
    • 2019-05-18
    • 2015-07-24
    • 1970-01-01
    • 2014-04-25
    • 1970-01-01
    相关资源
    最近更新 更多