首页 > 解决方案 > elasticsearch 同义词分析器给出 0 个结果

问题描述

我正在使用elasticsearch 7.0.0.

我正在尝试synonyms在创建index.

{
  "settings": {
    "index": {
      "analysis": {
        "analyzer": {
          "synonym": {
            "tokenizer": "whitespace",
            "filter": [
              "synonym"
            ]
          }
        },
        "filter": {
          "synonym": {
            "type": "synonym",
            "synonyms_path": "synonyms.txt"
          }
        }
      }
    }
  },
  "mappings": {
    "properties": {
      "address.state": {
        "type": "text",
        "analyzer": "synonym"
      },
      "location": {
        "type": "geo_point"
      }
    }
  }
}

这是插入索引的文档:

{
  "name": "Berry's Burritos",
  "description": "Best burritos in New York",
  "address": {
    "street": "230 W 4th St",
    "city": "New York",
    "state": "NY",
    "zip": "10014"
  },
  "location": [
    40.7543385,
    -73.976313
  ],
  "tags": [
    "mexican",
    "tacos",
    "burritos"
  ],
  "rating": "4.3"
}

还有内容synonyms.txt

ny, new york, big apple

address.state当我尝试在财产中搜索任何东西时,我得到了empty结果。

这是查询:

{
  "query": {
    "bool": {
      "filter": {
        "range": {
          "rating": {
            "gte": 4
          }
        }
      },
      "must": {
        "match": {
          "address.state": "ny"
        }
      }
    }
  }
}

即使ny在查询中使用(原样:无同义词),结果也是空的。

之前,当我创建不带 的索引时mappings,查询用于给出结果,仅同义词除外。

但是现在有了mappings,即使存在该术语,结果也是空的。

这个查询虽然有效: { "query": { "query_string": { "query": "tacos", "fields": [ "tags" ] } } }

我查看并研究了许多文章/教程并提出了这么多。

我现在在这里缺少什么?

标签: elasticsearchelasticsearch-pluginelasticsearch-analyzers

解决方案


在建立索引时,您将值传递为"state":"NY". 注意 的情况NY。设置中定义的分析器synonym只有一个过滤器,即synonym. NY由于大小写,不匹配 synonym.txt 中定义的任何同义词集。注意NY不等于ny. 为了克服这个问题(或者我们可以称之为不区分大小写)在lowercase过滤器之前添加过滤synonym器到synonym分析器。这将确保任何输入文本首先小写,然后应用同义词过滤器。当您使用全文搜索查询在该字段上进行搜索时,也会发生同样的情况。

所以你的设置如下:

  "settings": {
    "index": {
      "analysis": {
        "analyzer": {
          "synonym": {
            "tokenizer": "whitespace",
            "filter": [
              "lowercase",
              "synonym"
            ]
          }
        },
        "filter": {
          "synonym": {
            "type": "synonym",
            "synonyms_path": "synonyms.txt"
          }
        }
      }
    }
  }

映射不需要更改。

为什么它最初有效?

对此的回答是因为当您没有定义任何映射时,elastic 将映射address.state为一个text没有为该字段定义显式分析器的字段。在这种情况下,elasticsearch 默认使用标准分析器,该分析器使用小写标记过滤器作为过滤器之一。因此查询与文档匹配。


推荐阅读