elasticsearch同义词分析器给出0个结果

时间:2019-04-13 13:49:40

标签: elasticsearch elasticsearch-plugin elasticsearch-analyzers

我正在使用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”:“炸玉米饼”,       “字段”:[         “标签”       ]     }   } }

我查看并研究了许多文章/教程,并提出了到目前为止的建议。

我现在在这里想念什么?

1 个答案:

答案 0 :(得分:3)

建立索引时,您将值传递为"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使用standard analyzer,后者将小写标记过滤器用作过滤器之一。因此查询与文档匹配。