ElasticSearch 索引与搜索时间分析器

ElasticSearch index vs search time analyzer

运行 遇到了一个问题,这让我觉得我没有完全理解 ElasticSearch 5.5 中的索引与搜索时间分析。

假设我有一个只有 namestate 的人的基本索引。为简单起见,我将 al => alabama 设置为唯一的状态同义词。

PUT people
{
  "mappings": {
    "person": {
      "properties": {
        "name": {
          "type": "text"
        },
        "state": {
          "type": "text",
          "analyzer": "us_state"
        }
      }
    }
  },
  "settings": {
    "analysis": {
      "filter": {
        "state_synonyms": {
          "type": "synonym",
          "synonyms": "al => alabama"
        }
      },
      "analyzer": {
        "us_state": {
          "filter": [
            "standard",
            "lowercase",
            "state_synonyms"
          ],
          "type": "custom",
          "tokenizer": "standard"
        }
      }
    }
  }
}

我的理解是,当我索引文档时,state 字段数据将被索引为扩展的同义词形式。这个可以测试运行ning:

GET people/_analyze
{
  "text": "al",
  "field": "state"
}

哪个returns

{
  "tokens": [
    {
      "token": "alabama",
      "start_offset": 0,
      "end_offset": 2,
      "type": "SYNONYM",
      "position": 0
    }
  ]
}

看起来不错,让我们索引文档:

POST people/person
{
  "name": "dave",
  "state": "al"
}

并执行搜索:

GET people/person/_search
{
  "query": {
    "bool": {
      "should": [
        {
          "term": {
            "state": "al"
          }
        }
      ]
    }
  }
}

哪个returns什么都没有:

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

我希望搜索中的 al 通过相同的 us_state 分析器 运行 并匹配我的文档。但是,如果我将查询更改为:

,搜索确实有效

"term": { "state": "alabama" }

这是因为您使用了不分析输入的 term 查询。您应该将其更改为使用 match 查询,一切都会好起来的

GET people/person/_search
{
  "query": {
    "bool": {
      "should": [
        {
          "match": {
            "state": "al"
          }
        }
      ]
    }
  }
}