在Elasticsearch中,如何使用&符号搜索值?尝试:
http://localhost:9200/my_index/_search?q=name:"procter \u0026 gamble"
答案 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
}