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

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

我现在在这里想念什么?

最佳答案

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

关于elasticsearch - elasticsearch同义词分析器给出0个结果,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/55666197/

10-15 20:21