使用以下格式编制索引文档:
{
"title": "this is the title",
"brand": "brand here",
"filters": ["filter1", "filter2", "Sin filters", "Camera IP"]
"active": true
}
然后查询如下:
'query': {
'function_score': {
'query': {
'bool': {
'filter': [
{
'term': {
'active': True
}
}
],
'must': [
{
'terms': {
'filters': ['camera ip']
}
}
]
}
}
}
}
我无法使用“Camera IP”过滤器(或此字符串的任何变体,小写等)返回任何文档,但Es返回带过滤器的文件:“Sin过滤器”。
使用以下设置创建索引。请注意,“过滤器”字段将属于默认模板,类型为关键字
"settings":{
"index":{
"analysis":{
"analyzer":{
"keylower":{
"tokenizer":"keyword",
"filter":"lowercase"
}
}
}
}
},
"mappings": {
"_default_": {
"dynamic_templates": [
{
"string_as_keywords": {
"mapping": {
"index": "not_analyzed",
"type" : "keyword",
**"analyzer": "keylower"** # I also tried with and without changing this analyzer
},
"match": "*",
"match_mapping_type": "string"
}
},
{
"integers": {
"mapping": {
"type": "integer"
},
"match": "*",
"match_mapping_type": "long"
}
},
{
"floats": {
"mapping": {
"type": "float"
},
"match": "*",
"match_mapping_type": "double"
}
}
]
}
}
我缺少什么?奇怪的是它返回那些带有“Sin过滤器”过滤器而不是“Camera IP”。
感谢。
答案 0 :(得分:2)
您似乎希望过滤器为小写而不是标记化。我认为您的查询的问题是您将字符串的类型设置为"关键字" ES不会分析这些字段,甚至不会改变它们的情况:
关键字字段只能按其确切值进行搜索。
这就是为什么使用您的设置仍然可以使用如下查询检索文档:{"query": {"term": {"filters": "Camera IP"}}}'
。
由于您希望分析器在编制索引之前更改文本的大小写,因此您应将类型设置为text
,方法是将映射更改为以下内容:
{"settings":{
"index": {
"analysis":{
"analyzer":{
"test_analyzer":{
"tokenizer":"keyword",
"filter":"lowercase"
}
}
}
}
},
"mappings": {
"_default_": {
"dynamic_templates": [
{
"string_as_keywords": {
"mapping": {
"type": "text",
"index": "not_analyzed",
"analyzer": "test_analyzer"
},
"match": "*",
"match_mapping_type": "string"
}
}
]
}
}}
答案 1 :(得分:0)