我正在尝试使用带有重音字符的elasticsearch中的query_string
来搜索字符串。
当我使用query_string
没有分析器进行查询时,我只得到完全匹配的结果(我正在搜索字符串“Ředitelkvality”所以当我点“Reditel kvality”时我得不到结果)
当我使用与映射中使用的相同的分析器时,无论是否带有提升字符的字符串都没有结果。
分析仪&过滤器:
"analysis": {
"filter": {
"cs_CZ": {
"recursion_level": "0",
"locale": "cs_CZ",
"type": "hunspell",
"dedup": "true"
},
"czech_stemmer": {
"type": "stemmer",
"language": "czech"
},
"czech_stop": {
"type": "stop",
"stopwords": "_czech_"
}
},
"analyzer": {
"cz": {
"filter": [
"standard",
"lowercase",
"czech_stop",
"icu_folding",
"cs_CZ",
"lowercase"
],
"type": "custom",
"tokenizer": "standard"
},
"folding": {
"filter": [
"standard",
"lowercase",
"asciifolding"
],
"type": "custom",
"tokenizer": "standard"
}
映射:
"index1": {
"mappings": {
"type1": {
"properties": {
"revisions": {
"type": "nested",
"properties": {
"title": {
"type": "text",
"boost": 10.0,
"fields": {
"folded": {
"type": "text",
"boost": 6.0,
"analyzer": "folding"
}
},
"analyzer": "cz"
这里的术语向量看起来很好:
"term_vectors": {
"revisions.title": {
"field_statistics": {
"sum_doc_freq": 764,
"doc_count": 201,
"sum_ttf": 770
},
"terms": {
"kvalita": {
"term_freq": 1,
"tokens": [
{
"position": 1,
"start_offset": 8,
"end_offset": 15
}
]
},
"reditel": {
"term_freq": 1,
"tokens": [
{
"position": 0,
"start_offset": 0,
"end_offset": 7
}
]
}
}
}
}
当我在查询index1/_analyze?field=type1.revisions.title&text=Ředitel%20kvality
上运行分析时
我得到相同的令牌。
{
"tokens": [
{
"token": "reditel",
"start_offset": 0,
"end_offset": 7,
"type": "<ALPHANUM>",
"position": 0
},
{
"token": "kvalita",
"start_offset": 8,
"end_offset": 15,
"type": "<ALPHANUM>",
"position": 1
}
]
}
我无法找出错误以及为什么ES不会将“Reditel kvality”与“Ředitelkvality”相匹配。
这是我正在使用的查询:
{
"query":{
"bool":{
"must":[
{
"query_string":{
"query":"\u0158editel kvality*",
"rewrite":"scoring_boolean",
"analyzer":"cz",
"default_operator":"AND"
}
}
]
}
},
"size":10,
"from":0
}
我的ES版本是5.2.2
答案 0 :(得分:0)
发现什么是错的。
必须在与分析器的映射中定义_all
字段。
我从文档中感觉到这是自动的,并且所有字段都是从分析的字段中神奇地创建的。
所以现在在我有的领域
_all": {
"enabled": true,
"analyzer": "cz"
},
它正在发挥作用。
感谢IRC上的很多 Xylakant 指导我。