什么类型最适合 elasticsearch "KEYWORDS"(如主题标签)字段?

what types are best for elasticsearch "KEYWORDS"(like hashtags) field?

我想为某些关键字创建 Elasticsearch 索引,例如.. hashtag。 并对 KEYWORD 进行同义词过滤。

我认为索引关键字有两种方法,第一种是制作 keyword 类型。

{
    "settings": {
        "keywordField": {
            "type": "keyword"
        }
    }
}

如果使用 League of Legends 创建索引 也许这个。

{
    "keywordField": ["leagueoflegends", "league", "legends", "lol" /* synonym */]
}

text类型:

{
    "settings": {
        "keywordField": {
            "type": "text",
            "analyzer": "lowercase_and_whitespace_and_synonym_analyzer"
        }
    }
}

也许是这个。

{
    "keywordField": ["league of legends"](synonym: lol => leagueoflegends)
}

如果对此字段使用 _analyzer api,则需要“leagueoflegends”、“league”、“legends”

搜索查询:'lol'、'league of legends'、'League of Legends' 必须匹配此字段。

哪种做法最好?

添加一个包含索引数据、映射、搜索查询和搜索结果的工作示例。在下面的示例中,我使用了两个同义词 lolleagueoflegends

索引映射:

{
  "settings": {
    "index": {
      "analysis": {
        "filter": {
          "synonym_filter": {
            "type": "synonym",
            "synonyms": [
              "leagueoflegends, lol"
            ]
          }
        },
        "analyzer": {
          "synonym_analyzer": {
            "filter": [
              "lowercase",
              "synonym_filter"
            ],
            "tokenizer": "standard"
          }
        }
      }
    }
  },
  "mappings": {
    "properties": {
      "keywordField": {
        "type": "text"
      }
    }
  }
}

索引数据:

{
    "keywordField": ["leagueoflegends", "league", "legends"]
}

搜索查询:

 {
  "query": {
    "match": {
      "keywordField": {
        "query": "lol",
        "analyzer": "synonym_analyzer"
      }
    }
  }
}

搜索结果:

"hits": [
      {
        "_index": "66872989",
        "_type": "_doc",
        "_id": "1",
        "_score": 0.19363807,
        "_source": {
          "keywordField": [
            "leagueoflegends",
            "league",
            "legends"
          ]
        }
      }
    ]