我已经设置了Elasticsearch并且正在运行查询,但是我得到了奇怪的结果,并且无法找出原因:
例如,这是我的映射的一个相关部分:
"classification": {
"type": "string",
"fields": {
"raw": {
"type": "string",
"index": "not_analyzed"
}
}
},
然后,这是一些查询和结果。对于所有这些,有一些对象的分类值为“珠宝和装饰品”:
查询:
"query": {
"bool": {
"must": [
{
"match_all": {}
},
{
"query_string": {
"query": "(classification:/jewel.*/)"
}
}
]
}
}
结果:
"hits": {
"total": 2541,
"max_score": 1.4142135,
"hits": [
{
...
但如果我加上“ry”:
查询:
"query_string": {
"query": "(classification:/jewelry.*/)"
}
结果:
"hits": {
"total": 0,
"max_score": null,
"hits": []
}
我也尝试过运行查询:
"query_string": {
"query": "(classification\\*:/jewelry.*/)"
}
(应匹配“分类”或“classification.raw”)
和
"query_string": {
"query": "(classification.raw:/jewelry.*/)"
}
我还尝试过案例变体,例如“珠宝”与“珠宝”,没有任何效果。所有这些都没有结果。这对我来说毫无意义。即使用“珠宝”(同样的情况和完全未分析的领域)查询“classification.raw”,我也没有得到任何结果。有什么想法吗?
更新
根据@keety的要求
{
"tokens": [
{
"token": "jewelri",
"start_offset": 0,
"end_offset": 7,
"type": "<ALPHANUM>",
"position": 1
},
{
"token": "adorn",
"start_offset": 10,
"end_offset": 19,
"type": "<ALPHANUM>",
"position": 2
}
]
}
我认为它将“珠宝”扼杀到“珠宝”这一事实是我的问题,但不确定为什么会这样做或如何解决它。
更新#2
这些是分析者:
"analyzer": {
"default_index": {
"type": "custom",
"tokenizer": "icu_tokenizer",
"filter": [
"icu_folding",
"custom_stem",
"porter_stem",
"index_filter"
],
"char_filter": [
"html_strip",
"quotes"
]
},
"default_search": {
"type": "custom",
"tokenizer": "icu_tokenizer",
"filter": [
"icu_folding",
"custom_stem",
"porter_stem",
"search_filter"
],
"char_filter": [
"html_strip",
"quotes"
]
}
}
更新#3
我在其中一个应该匹配的对象上运行_explain
查询但是没有得到以下内容:
"matched": false,
"explanation": {
"value": 0,
"description": "Failure to meet condition(s) of required/prohibited clause(s)",
"details": [
{
"value": 0.70710677,
"description": "ConstantScore(*:*), product of:",
"details": [
{
"value": 1,
"description": "boost"
},
{
"value": 0.70710677,
"description": "queryNorm"
}
]
},
{
"value": 0,
"description": "no match on required clause (ConstantScore())"
}
]
}
我不知道“必需条款(ConstantScore())”是什么。我能找到的唯一相关内容是Constant Score Query,但我没有在任何地方使用这个特定的查询。
更新#4
好的,这有点啰嗦。对于那个很抱歉。但是,我刚刚发现问题似乎在于使用正则表达式语法。如果我只使用基本通配符(以及"analyze_wildcard": true
),那么我的所有查询都会开始工作。