какие типы лучше всего подходят для поля KEYWORDS (например, хэштегов) elasticsearch?

я хочу сделать индекс Elasticsearch для чего-то КЛЮЧЕВЫХ СЛОВ, например .. хэштега. и сделать фильтр синонимов для КЛЮЧЕВЫХ СЛОВ.

Я думаю, что два способа индексирования ключевого слова, во-первых, сделать тип 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' должен соответствовать этому полю.

какая практика лучше?


person JYL    schedule 30.03.2021    source источник


Ответы (1)


Добавление рабочего примера с данными индекса, сопоставлением, поисковым запросом и результатом поиска. В приведенном ниже примере я взял два синонима lol и leagueoflegends.

Сопоставление индекса:

{
  "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"
          ]
        }
      }
    ]
person ESCoder    schedule 30.03.2021