如果字符串包含短划线和数字,则Bool查询失败?

时间:2015-09-29 08:40:22

标签: elasticsearch

我正在进行搜索,该搜索应返回与该主机匹配的所有文档。 当我搜索db.no, vg.no和仅包含单词的其他主机时,这种方法有效。如果我搜索包含-或数字的主机(h-a.no),那么ES不会返回任何内容。即使我知道存在与该主机匹配的文档。 主机字段id映射为字符串。

您是否知道为什么我能够使用q-param查找文档,但不能使用bool查询过滤器?

普通查询会返回与h-a.no

匹配的文档
$ curl -XGET 'http://docker:9200/harvester-test/entries/_search?pretty&q="h-a.no"'

{
  "took" : 10,
  "timed_out" : false,
  "_shards" : {
    "total" : 5,
    "successful" : 5,
    "failed" : 0
  },
  "hits" : {
    "total" : 1,
    "max_score" : 0.43920785,
    "hits" : [ {
      "_source":{
    "__v":0,
    "host":"h-a.no",
    //   [snipp..]

布尔查询

  {
    "sort": {
      "posted": "desc"
    },
    "query": {
      "filtered": {
        "query": {
          "match_all": {}
        },
        "filter": {
          "bool": {
            "must": [
              {
                "bool": {
                  "should": [
                    {}
                  ]
                }
              },
              {
                "bool": {
                  "should": [
                    [
                      {
                        "term": {
                          "host": "h-a.no"
                        }
                      }
                    ]
                  ]
                }
              },
              {
                "bool": {
                  "must_not": [
                    {}
                  ]
                }
              },
              {
                "bool": {
                  "must_not": [
                    {}
                  ]
                }
              },
              {
                "bool": {
                  "must": [
                    {}
                  ]
                }
              },
              {
                "bool": {
                  "must": [
                    {}
                  ]
                }
              }
            ]
          }
        }
      }
    },
    "aggs": {
      "itemscount": {
        "global": {}
      }
    }

映射

{
  "harvester" : {
    "mappings" : {
      "entries" : {
        "properties" : {
          "__v" : {
            "type" : "long"
          },
          "createdAt" : {
            "type" : "date",
            "format" : "dateOptionalTime"
          },
          "description" : {
            "type" : "string"
          },
          "externalId" : {
            "type" : "string"
          },
          "fields" : {
            "properties" : {
              "description" : {
                "type" : "string"
              },
              "duration" : {
                "type" : "string"
              },
              "image" : {
                "type" : "string"
              },
              "ingress" : {
                "type" : "string"
              }
            }
          },
          "guid" : {
            "type" : "string"
          },
          "host" : {
            "type" : "string"
          },
          "id" : {
            "type" : "string"
          },
          "image" : {
            "type" : "string"
          },
          "modifiedDate" : {
            "type" : "date",
            "format" : "dateOptionalTime"
          },
          "origin" : {
            "type" : "string"
          },
          "posted" : {
            "type" : "date",
            "format" : "dateOptionalTime"
          },
          "ranking" : {
            "type" : "long"
          },
          "source" : {
            "type" : "string"
          },
          "tags" : {
            "type" : "string"
          },
          "title" : {
            "type" : "string"
          },
          "updateTime" : {
            "type" : "date",
            "format" : "dateOptionalTime"
          },
          "url" : {
            "type" : "string"
          }
        }
      }
    }
  }
}

1 个答案:

答案 0 :(得分:0)

我检查了主机h-a.no的分析方式:

curl 'http://dockerhost:9200/_analyze?analyzer=standard&pretty' -d 'h-a.no'
{
  "tokens" : [ {
    "token" : "h",
    "start_offset" : 0,
    "end_offset" : 1,
    "type" : "<ALPHANUM>",
    "position" : 1
  }, {
    "token" : "a.no",
    "start_offset" : 2,
    "end_offset" : 6,
    "type" : "<ALPHANUM>",
    "position" : 2
  } ]
}

然后我将主机字段的映射更新为"index": "not_analyzed",以确保该域未被拆分为较小的部分。