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

时间:2016-04-13 20:20:21

标签: elasticsearch

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

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

我的查询很简单,如下所示:

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

当我搜索谷歌时,我该怎么做才能使弹性搜索返回文档?

2 个答案:

答案 0 :(得分:0)

我使用“通配符”查询

进行此类查询

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

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

答案 1 :(得分:0)

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

_all默认使用standard分析器编入索引,这意味着google.com不会在.拆分,而是会被归类为google.com。这意味着搜索google.com会在您的索引中查找此字词,而在您的文字中搜索google

在Elasticsearch中搜索不仅涉及查询,还涉及索引数据的方式。它可能不像使用LIKE 的 SQL查询那么简单,但与此同时,ES在 insert 时提供了比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"]
    }
  }