我在我的索引文档中有一个字段,我需要在其中搜索大小写敏感。我使用匹配查询来获取结果。我的数据文档的一个例子是:
{
"name" : "binoy",
"age" : 26,
"country": "India"
}现在,当我提出以下查询时:
{
“query” : {
“match” : {
“name” : “Binoy"
}
}
}这给了我“比诺伊”和“比诺伊”的匹配。我希望搜索能区分大小写。在默认情况下,elasticsearch似乎对大小写不敏感。如何在elasticsearch中使搜索区分大小写?
发布于 2015-06-23 02:26:41
在映射中,可以将字段定义为not_analyzed。
curl -X PUT "http://localhost:9200/sample" -d '{
"index": {
"number_of_shards": 1,
"number_of_replicas": 1
}
}'
echo
curl -X PUT "http://localhost:9200/sample/data/_mapping" -d '{
"data": {
"properties": {
"name": {
"type": "string",
"index": "not_analyzed"
}
}
}
}'现在,如果您可以做普通索引和正常搜索,它将不会分析它,并确保它提供不区分大小写的搜索。
发布于 2015-05-22 06:47:26
这取决于您为字段name定义的映射。如果您没有定义任何映射,那么elasticsearch将将其视为字符串,并使用标准分析器 (更低的情况下是令牌)来生成令牌。您的查询还将使用相同的分析器进行搜索,因此匹配是通过小写输入完成的。这就是为什么"Binoy“和"binoy”匹配的原因。
要解决这个问题,您可以在不使用lowercase过滤器的情况下定义一个自定义分析器,并将其用于您的字段name。您可以定义分析器如下
"analyzer": {
"casesensitive_text": {
"type": "custom",
"tokenizer": "standard",
"filter": ["stop", "porter_stem" ]
}
}您可以定义name的映射如下
"name": {
"type": "string",
"analyzer": "casesensitive_text"
}现在您可以在name上进行搜索。
注意:例如,上面的分析器就是目的。你可能需要根据你的需要来改变它。
发布于 2015-05-22 06:46:48
让你的地图像:
PUT /whatever
{
"settings": {
"analysis": {
"analyzer": {
"mine": {
"type": "custom",
"tokenizer": "standard"
}
}
}
},
"mappings": {
"type": {
"properties": {
"name": {
"type": "string",
"analyzer": "mine"
}
}
}
}
}意思是,该自定义分析器没有lowercase过滤器。
https://stackoverflow.com/questions/30389495
复制相似问题