我有下一个查询查询
{
"query":{
"bool":{
"must":[
{
"term":{
"cardrecord.fields.name.raw":"HERE_IS_SOME_NAME"
}
}
],
"must_not":[
],
"should":[
]
}
},
"from":0,
"size":50,
"sort":[
],
"facets":{
}
}
如何按字词修改区分大小写的查询?如果需要,我可以添加更多描述。
最佳答案
默认情况下,所有字段都使用Standard Analyzer
进行分析。如果在"index":"not_analyzed"
中指定了mapping
,则不会分析该字段Standard Analyzer
将输入字符串转换为小写并用空格和特殊字符分割。因此,在您的情况下,HERE_IS_SOME_NAME
将被拆分为 token some
,name
。但是将不会创建标记here
和is
,因为它们是英语副词。
当您搜索"cardrecord.fields.name.raw"
字段时,也会发生同样的事情。它拆分为标记,并在特定字段中搜索所有带有该标记的文档(使用Standard Analyzer
)。附言:也可以配置单独的或不同的analyzer
进行搜索。
因此,匹配查询会搜索带有some
和name
token 的所有文档。因此,您将获得其他文件。term query
专门查找确切的大小写和全字匹配。但这不会与任何文档匹配,因为 token 已经是split
和lowercase
请按照您的要求执行以下步骤:
{
"mappings": {
"my_type": {
"properties": {
"cardrecord.fields.name.raw": {
"type": "string",
"index": "not_analyzed"
}
}
}
}
}
按照上面给出的代码,将此
mapping
更新为名为index
的my_type
。但是,您需要使用新的映射创建新的索引。由于更新可能无法反射(reflect)。然后尝试在您的问题中运行搜索查询。
添加详细的查询顺序:
映射:
{
"mappings": {
"my_type": {
"properties": {
"cardrecord.fields.name.raw": {
"type": "string",
"index": "not_analyzed",
"store": "true"
}
}
}
}
}
索引文件:
{
"cardrecord.fields.name.raw": "HERE_IS_SOME_NAME"
}
搜索查询:
{
"query": {
"bool": {
"must": [
{
"term": {
"cardrecord.fields.name.raw": "HERE_IS_SOME_NAME"
}
}
],
"must_not": [],
"should": []
}
},
"from": 0,
"size": 50,
"sort": [],
"facets": {}
}
关于elasticsearch - Elasticsearch术语不敏感搜索,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34201041/