使用elasticsearch中应用的同义词查找精确值

时间:2016-07-20 08:57:01

标签: elasticsearch

我为某些字段设置了同义词,但我希望将其应用于我映射到not_analyzed的字段。

例如,我有foo字段存储seksyen 10 not_analyzed,并为seksyen, section添加同义词条目(处理文档中的混合语言)。< / p>

'foo': {'type': 'string', 'index': 'not_analyzed'}

假设用户发出查询

{"term": {"foo": "section 10"}}

并期待fooseksyen 10以及section 10。但是,对于当前映射,我无法在给定查询的情况下返回seksyen 10。此外,我在这里进行过滤查询,因为我不希望这些被退回

whatever seksyen 10
seksyen 10, something
whatever section 10 something

我只想将同义词扩展应用于查询,而不在查询中指定。我该怎么做?

1 个答案:

答案 0 :(得分:1)

首先,使用term不会对搜索到的文本进行任何分析,因此您需要不同类型的查询。

您可以执行以下操作:

{
  "mappings": {
    "test": {
      "properties": {
        "foo": {
          "type": "string",
          "index": "not_analyzed",
          "search_analyzer": "synonym"
        }
      }
    }
  },
  "settings": {
    "analysis": {
      "analyzer": {
        "synonym": {
          "tokenizer": "whitespace",
          "filter": [
            "synonym"
          ]
        }
      },
      "filter": {
        "synonym": {
          "type": "synonym",
          "synonyms": [
            "seksyen, section"
          ]
        }
      }
    }
  }
}

因此,您只能在搜索时定义search_analyzer。然后你需要放弃term过滤器,否则它将无效:

{
  "query": {
    "match": {
      "foo": "section"
    }
  }
}

上述解决方案适用于ES 1.x.在ES 2.x中,search_analyzernot_analyzed字段将不再可能。