无法查询_all中的edge_ngram字段

时间:2016-06-22 03:25:24

标签: elasticsearch

所以我正在建立一个索引,我想进行一次搜索,对一个字段进行部分字edge_ngram搜索,并对其余字段进行更正常的搜索。根据我的理解,只需匹配_all即可轻松完成。但是我似乎无法让它发挥作用。

我已经能够从bool查询获得所需的结果,该查询分别搜索_all和特定的ngram字段,但这看起来像是hackey,我猜我只有一些简单的东西,我是丢失。

这里只是一个最小的例子来展示我正在做什么以及它对我不起作用。

这是索引设置:

curl -XPUT "http://localhost:9200/test_index?pretty=true" -d'
{
   "settings": {
      "analysis": {
         "filter": {
            "edge_ngram_filter": {
               "type": "edge_ngram",
               "min_gram": 2,
               "max_gram": 20
            }
         },
         "analyzer": {
            "edge_ngram_analyzer": {
               "type": "custom",
               "tokenizer": "standard",
               "filter": [
                  "lowercase",
                  "edge_ngram_filter"
               ]
            }
         }
      }
   },
   "mappings": {
      "doc": {
         "properties": {
            "text_field": {
               "type": "string",
               "analyzer": "edge_ngram_analyzer",
               "search_analyzer": "standard"
            }
         }
      }
   }
}'

并添加一个简单的文档:

curl -XPUT "http://localhost:9200/test_index/doc/1?pretty=true" -d'
{
    "text_field": "Hello, World!"
}'

_所有部分搜索都不起作用。它返回一个空结果。

curl -XPOST "http://localhost:9200/test_index/_search?pretty=true" -d'
{
    "query": {
        "match": {
            "_all": "hell"
        }
    }
}'

_所有全文搜索都可以使用

curl -XPOST "http://localhost:9200/test_index/_search?pretty=true" -d'
{
    "query": {
        "match": {
            "_all": "hello"
        }
    }
}'

部分搜索特定字段

curl -XPOST "http://localhost:9200/test_index/_search?pretty=true" -d'
{
    "query": {
        "match": {
            "text_field": "hell"
        }
    }
}'

术语矢量看起来也很好

curl -XGET "http://localhost:9200/test_index/doc/1/_termvector?fields=text_field&pretty=true"

我真的无法弄清楚我在这里做错了什么。任何帮助将不胜感激。

以下是有关我的环境的一些细节。

  • Elasticsearch版本:Version: 2.3.3, Build: 218bdf1/2016-05-17T15:40:04Z, JVM: 1.8.0_92
  • Linux OS:Arch Linux
  • 内核版本:4.4.3-1-custom

1 个答案:

答案 0 :(得分:1)

action_name == "index"字段将所有字段的原始值组合为字符串,而不是为每个字段生成的字词。因此,在您的情况下,它不包含_all生成的字词,只包含edge_ngram_analyzer字段中的文字。它就像任何其他文本字段一样,您可以为它指定分析器等。在您的示例中,它使用默认分析器。