Elasticsearch-通配符搜索的亮点

时间:2019-01-28 07:18:43

标签: elasticsearch

我发现通配符高亮的行为几乎没有什么不同。 当我使用单个“ ”(即通配符)进行搜索时,它不会突出显示任何值。 但是,如果我使用两个或多个“ ”(即通配符)进行同样的操作,它将突出显示所有值。 尽管获取的结果是相同的,但为什么高光显示会有这样的差异? 例子:

1。多个通配符

{
  "from": 0,
  "size": 10,
  "_source": {
    "includes": [
      "ID"
    ]
  },
  "query": {
    "bool": {
      "should": [
        {
          "bool": {
            "must": [
              {
                "query_string": {
                  "query": "**",
                  "fields": [
                    "ID"
                  ]
                }
              }
            ]
          }
        }
      ],
      "minimum_should_match": 1
    }
  },
  "highlight": {
    "type": "unified",
    "fragment_size": 0,
    "order": "score",
    "number_of_fragments": 4,
    "fields": {
      "*": {}
    }
  }
}

结果:

{
  "_index": "index_name",
  "_type": "_doc",
  "_id": "AUTO",
  "_score": 1,
  "_source": {
    "ID": "AUTO"
  },
  "highlight": {
    "ID": [
      "<em>AUTO</em>"
    ]
  }
}

2。单个通配符:

{
  "from": 0,
  "size": 10,
  "_source": {
    "includes": [
      "ID"
    ]
  },
  "query": {
    "bool": {
      "should": [
        {
          "bool": {
            "must": [
              {
                "query_string": {
                  "query": "*",
                  "fields": [
                    "ID"
                  ]
                }
              }
            ]
          }
        }
      ],
      "minimum_should_match": 1
    }
  },
  "highlight": {
    "type": "unified",
    "fragment_size": 0,
    "order": "score",
    "number_of_fragments": 4,
    "fields": {
      "*": {}
    }
  }
}   

结果:

{
  "_index": "index_name",
  "_type": "_doc",
  "_id": "AUTO",
  "_score": 1,
  "_source": {
    "ID": "AUTO"
  }
}

2 个答案:

答案 0 :(得分:0)

对于这些查询为何表现不同的问题,我没有直接答案。但是您可以改用通配符查询。

{
  "_source": {
    "includes": [
      "ID"
    ]
  },
  "query": {
    "bool": {
      "should": [
        {
          "bool": {
            "must": [
              {
                "wildcard": {
                  "ID": "*"
                }
              }
            ]
          }
        }
      ],
      "minimum_should_match": 1
    }
  },
  "highlight": {
    "type": "unified",
    "fragment_size": 0,
    "order": "score",
    "number_of_fragments": 4,
    "fields": {
      "*": {}
    }
  }
}

希望这会有所帮助。

答案 1 :(得分:0)

请查看the documentation of Query String Query。有:

  

将纯通配符\*重写为exists查询以提高效率。作为一个   因此,通配符"field:*"将匹配带有   空值,如下所示:{ "field": "" } ...并且会   如果字段丢失或使用显式的空值设置,则不匹配   类似于以下内容:{ "field": null }

因此,我猜测单数*会因此而以特殊方式处理。