我在弹性搜索服务器上遇到了一个奇怪的问题。
弹性搜索版本为1.6。 '记录'是类型的名称。搜索的网址为http://some.domain:9200/user/records/_search。 “' un'的字段映射是字符串。
以下用于年的查询有时失败,具体取决于{someId}较新的ID失败,旧的有效。它的数据还没有找到...
{
"from": 0,
"size": 1,
"sort": {
"un": "desc",
"_score": "desc"
},
"query": {
"query_string": {
"query": "un:\"{someId}\"",
"fields": [
"id",
"un",
"e",
"fn",
"ln",
"bn",
"jt",
"sy",
"c",
"st",
"p",
"fbid",
"lnid"
]
}
}
}
在做了一些诊断后,我发现无论{someId}是旧的还是新的,以下查询总是有效...
{
"query": {
"bool": {
"must": [
{
"query_string": {
"default_field": "records.un",
"query": "{someId}"
}
}
],
"must_not": [],
"should": []
}
},
"from": 0,
"size": 10,
"sort": [],
"aggs": {}
}
这是一个与第二个查询匹配的示例文档,但与第一个查询失败。
{
"un": "xxxxxxx.xxxxxxx",
"e": "xxxxxxx",
"pswd": "xxxxxxx",
"fn": "xxxxxxx",
"ln": "xxxxxxx",
"bn": "xxxxxxx",
"jt": "",
"sy": "xxxxxxx",
"urole": "User",
"id": "xxxxxxx",
"status": "1",
"lld": "201704280016",
"cd": "201702100132",
"md": "201704280549",
"cc": "0",
"p": "",
"logo": "",
"mlogo": "",
"ad": "201702100132",
"com": "xxxxxxx",
"rr": "true",
"sid": "00000000-0000-0000-0000-000000000000",
"fbidp": "",
"lnidp": "",
"role": "Lots of data is in this one",
"dim": "",
"drm": "",
"drcm": "xxxxxxx",
"drcfbm": "xxxxxxx",
"drclnm": "xxxxxxx",
"as": "false",
"apr": "true",
"iuid": "xxxxxxx",
"vcount": "9",
"pplatform": "",
"pname": "",
"pid": "00000000-0000-0000-0000-000000000000",
"preciept": "",
"ms": "Free"
}
我认为重新索引服务器可能会解决问题。有什么方法可以解决弹性搜索中的奇怪数据检索问题?
答案 0 :(得分:1)
您的第一个("query": "un:\"{someId}\""
)查询和第二个("query": "{someId}"
)查询之间存在显着差异。在以前的查询中,当您将someId
包装在引号中时,它将搜索exact phrase
,即如果您有xxx.yyy
,那么它将查找整个ID,包括点(.
)所以只有当id不包含点时才会匹配id,而在后一个查询中,someId
将analyzed
,xxx.yyy
将被标记为两个字符串(xxx
和yyy
)如果你有点,它将匹配。
您需要更改un
字段的映射。如果您未在un
上执行任何全文搜索查询,那么我建议您将其设为not_analyzed
。否则,您需要使用whitespace
之类的不同分析器,而不是默认standard analyzer
。我真的建议使用以前的解决方案,因为它(结构化exact
字段)比后者更有效。