8

我正在通过 ElasticSearch 进行文本搜索,并且使用术语类型进行查询时出现问题。我在下面做的基本上是,

  1. 添加带有中文字符串(你好)的文档。
  2. 用文本方法查询,返回文档。
  3. 用 term 方法查询,什么也不返回。

那么,为什么会这样呢?以及如何解决它。

➜  curl -XPOST 'http://localhost:9200/test/test/' -d '{ "name" : "你好" }'

{
  "ok": true,
  "_index": "test",
  "_type": "test",
  "_id": "VdV8K26-QyiSCvDrUN00Nw",
  "_version": 1
}

➜  curl -XGET 'http://localhost:9200/test/test/_mapping?pretty=1'

{
  "test" : {
    "properties" : {
      "name" : {
        "type" : "string"
      }
    }
  }
}

➜  curl -XGET 'http://localhost:9200/test/test/_search?pretty=1'

{
  "took": 1,
  "timed_out": false,
  "_shards": {
    "total": 5,
    "successful": 5,
    "failed": 0
  },
  "hits": {
    "total": 1,
    "max_score": 1.0,
    "hits": [
      {
        "_index": "test",
        "_type": "test",
        "_id": "VdV8K26-QyiSCvDrUN00Nw",
        "_score": 1.0,
        "_source": {
          "name": "你好"
        }
      }
    ]
  }
}

➜  curl -XGET 'http://localhost:9200/test/test/_search?pretty=1' -d '{
  "query": {
    "text": {
      "name": "你好"
    }
  }
}'

{
  "took": 2,
  "timed_out": false,
  "_shards": {
    "total": 5,
    "successful": 5,
    "failed": 0
  },
  "hits": {
    "total": 1,
    "max_score": 0.8838835,
    "hits": [
      {
        "_index": "test",
        "_type": "test",
        "_id": "VdV8K26-QyiSCvDrUN00Nw",
        "_score": 0.8838835,
        "_source": {
          "name": "你好"
        }
      }
    ]
  }
}

➜  curl -XGET 'http://localhost:9200/test/test/_search?pretty=1' -d '{
  "query": {
    "term": {
      "name": "你好"
    }
  }
}'

{
  "took" : 2,
  "timed_out" : false,
  "_shards" : {
    "total" : 5,
    "successful" : 5,
    "failed" : 0
  },
  "hits" : {
    "total" : 0,
    "max_score" : null,
    "hits" : [ ]
  }
}
4

2 回答 2

8

来自关于术语查询的 ElasticSearch 文档:

匹配具有包含术语(未分析)的字段的文档。

name字段是默认分析的,因此无法通过术语查询找到(仅查找未分析的字段)。您可以尝试使用不同的name(不是中文的)索引另一个文档,并且它也无法通过术语查询找到。如果您现在想知道为什么以下搜索查询会返回结果:

curl -XGET 'http://localhost:9200/test/test/_search?pretty=1' -d '{"query" : {"term" : { "name" : "好" }}}'

这是因为每个令牌都是一个未分析的术语。如果您要索引名称为“你好吗”的文档,您也不会找到包含“好吗”或“好你”的文档,但您可以找到包含“你”、“好”或“吗”的文档一个术语查询。

对于中文,您可能需要特别注意使用的分析仪。对我来说,标准分析器似乎已经足够好了(逐个字符地标记中文短语,而不是空格)。

于 2013-11-11T13:12:19.527 回答
1

默认分析器不适用于亚洲语言。尝试使用这样的分析器: https ://github.com/elasticsearch/elasticsearch-analysis-smartcn

于 2014-02-28T03:49:58.437 回答