弹性搜索:简单查询不返回预期结果



我使用的是Elasticsearch 2.2.0,但这也发生在1.x版本中。

其中一个文本字段包含单词google.com。当我尝试在谷歌上搜索时,ElasticSearch不会返回任何内容。但如果我搜索谷歌,它会返回包含它的文档。

我的查询很简单,大致如下:

query: {
  filtered: {
    query: {
      simple_query_string: {
        query: "google"
      }
    }
  }
}

当我搜索谷歌时,我应该怎么做才能让Elastic搜索返回文档?

我建议阅读有关_all字段的文档,因为simple_query_string在没有指定任何字段时会使用此字段,这就是您的情况。

默认情况下,使用standard分析器对_all进行索引,这意味着google.com将不会在.进行拆分,而将被索引为google.com。这意味着搜索google.com会在索引中查找该术语,而在文本中则有google

Elasticsearch中的搜索不仅涉及查询,还涉及对数据进行索引的方式。它可能不像使用LIKE的SQL查询那么简单,但同时,ES在插入时比SQL提供了更多的功能。

根据您想要的simple_query,您有多种选择:

  • 更改_all字段的分析器:
{
  "settings": {
    "analysis": {
      "analyzer": {
        "letter": {
          "type": "custom",
          "tokenizer": "letter",
          "filter": [
            "lowercase"
          ]
        }
      }
    }
  }, 
  "mappings": {
    "test": {
      "_all": {
        "analyzer": "letter"
      }

以及查询:

  "query": {
    "simple_query_string": {
      "query": "google"
    }
  }
  • 更改field的分析器并**使用query_string_query中的该字段:
{
  "settings": {
    "analysis": {
      "analyzer": {
        "letter": {
          "type": "custom",
          "tokenizer": "letter",
          "filter": [
            "lowercase"
          ]
        }
      }
    }
  }, 
  "mappings": {
    "test": {
      "properties": {
        "text": {
          "type": "string",
          "analyzer": "letter"
        }
      }

查询:

  "query": {
    "simple_query_string": {
      "query": "google",
      "fields": ["text"]
    }
  }
  • 使用自己的letter分析器定义自己的自定义all字段,并在simple_query_string中使用

我用"通配符"查询进行这种查询

https://www.elastic.co/guide/en/elasticsearch/reference/current/query-dsl-wildcard-query.html

{
  "query": {
    "bool": {
      "must": {
        "wildcard": {
          "fieldname": "google*" // replace the fieldname her
        }
      }
    }
  }
}

最新更新