有什么方法可以解决弹性搜索中的奇怪数据检索问题?

时间:2017-04-28 06:47:26

标签: elasticsearch

我在弹性搜索服务器上遇到了一个奇怪的问题。

弹性搜索版本为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"
}

我认为重新索引服务器可能会解决问题。有什么方法可以解决弹性搜索中的奇怪数据检索问题?

1 个答案:

答案 0 :(得分:1)

您的第一个("query": "un:\"{someId}\"")查询和第二个("query": "{someId}")查询之间存在显着差异。在以前的查询中,当您将someId包装在引号中时,它将搜索exact phrase,即如果您有xxx.yyy,那么它将查找整个ID,包括点(. )所以只有当id不包含点时才会匹配id,而在后一个查询中,someIdanalyzedxxx.yyy将被标记为两个字符串(xxxyyy)如果你有点,它将匹配。

您需要更改un字段的映射。如果您未在un上执行任何全文搜索查询,那么我建议您将其设为not_analyzed。否则,您需要使用whitespace之类的不同分析器,而不是默认standard analyzer。我真的建议使用以前的解决方案,因为它(结构化exact字段)比后者更有效。