令人困惑的query_string搜索结果

时间:2015-09-14 16:34:21

标签: elasticsearch

我已经设置了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),那么我的所有查询都会开始工作。

0 个答案:

没有答案