如何在Elasticsearch中搜索&符号?

时间:2015-08-12 11:07:59

标签: elasticsearch ampersand

在Elasticsearch中,如何使用&符号搜索值?尝试:

http://localhost:9200/my_index/_search?q=name:"procter \u0026 gamble"

2 个答案:

答案 0 :(得分:2)

有多种方法,但有一种方法是在映射中将字符串声明为not_analyzed(见下文),然后搜索已编入索引的确切值。

curl -XPUT localhost:9200/tests -d '{
  "mappings": {
    "test": {
      "properties": {
        "name": {
          "type": "string",
          "fields": {
            "raw": {
              "type": "string",
              "index": "not_analyzed"
            }
          }
        }
      }
    }
  }
}'

现在我们索引一个示例文档:

curl -XPUT localhost:9200/tests/test/1 -d '{"name":"procter & gamble"}'

最后,您的搜索查询将返回您期望的文档:

curl -XGET localhost:9200/tests/test/_search?q=name.raw:"procter %26 gamble"

更新以下是使用nGram tokenizer的另一种更为复杂的方式,该方式将索引所有可能的名称长度为2到20(任意选择)的令牌。

curl -XPUT localhost:9200/tests -d '{
  "settings": {
    "analysis": {
      "analyzer": {
        "ngram_analyzer": {
          "tokenizer": "ngram_tokenizer",
          "filter": [
            "lowercase"
          ]
        }
      },
      "tokenizer": {
        "ngram_tokenizer": {
          "type": "nGram",
          "min_gram": 2,
          "max_gram": 20
        }
      }
    }
  },
  "mappings": {
    "test": {
      "properties": {
        "name": {
          "type": "string",
          "index_analyzer": "ngram_analyzer",
          "search_analyzer": "keyword"
        }
      }
    }
  }
}'

然后您可以像之前一样搜索确切的名称

curl -XGET localhost:9200/tests/test/_search?q=name:"procter %26 gamble"

或者只是通过您名字中的一些令牌

curl -XGET localhost:9200/tests/test/_search?q=name:procter
curl -XGET localhost:9200/tests/test/_search?q=name:"procter %26"
curl -XGET localhost:9200/tests/test/_search?q=name:gamble

答案 1 :(得分:0)

我使用了一些不同的方法。 创建具有特殊字符的自定义模式分析器(我使用了&'-@)。

ES中原始的模式分析器为“ \ W +”

从ES文档开始 https://www.elastic.co/guide/en/elasticsearch/reference/current/analysis-pattern-analyzer.html

  

模式分析器使用正则表达式将文本分成多个词条。正则表达式应与令牌分隔符而不是令牌本身匹配。正则表达式默认为\ W +(或所有非单词字符)。

因此,要添加特殊字符,我必须反转此正则表达式的逻辑。这是我的自定义分析器。

    "special_chars_analyzer": {
      "type": "pattern",
      "pattern": "[^\\w&'-@]+",
      "lowercase": true
    }