Elasticsearch объединяет два слова в одно - PullRequest
0 голосов
/ 04 июня 2019

У меня есть поле ManufacturerName

"ManufacturerName": {
    "type": "keyword",
    "normalizer" : "keyword_lowercase"
},

и нормализатор

"normalizer": {
    "keyword_lowercase": {
       "type": "custom",
       "filter": ["lowercase"]
    }
}

При поиске 'ripcurl' оно совпадает. Однако при поиске 'rip curl' это не так.

Как / что бы использовать для объединения определенных слов. то есть 'rip curl' -> 'ripcurl'

Извините, если это дубликат, я потратил некоторое время на поиски решения этой проблемы.

1 Ответ

1 голос
/ 04 июня 2019

Вы хотели бы использовать поле text для того, что вы ищете, и выполнить такое требование через Ngram Tokenizer

Нижепримерное отображение, запрос и ответ:

Отображение:

PUT mysomeindex
{
  "mappings": {
    "mydocs":{
      "properties": { 
        "ManufacturerName":{
          "type": "text",
          "analyzer": "my_analyzer", 
          "fields":{
            "keyword":{
              "type": "keyword",
              "normalizer": "my_normalizer"
            }
          }
        }
      }
    }
  }, 
  "settings": {
    "analysis": {
      "normalizer": {
        "my_normalizer":{
          "type": "custom",
          "char_filter": [],
          "filter": ["lowercase", "asciifolding"]
        }
      },
      "analyzer": {
        "my_analyzer": {
          "tokenizer": "my_tokenizer",
          "filter": [ "synonyms" ]
        }
      },
      "tokenizer": {
        "my_tokenizer": {
          "type": "ngram",
          "min_gram": 3,
          "max_gram": 5,
          "token_chars": [
            "letter",
            "digit"
          ]
        }
      },
      "filter": {
        "synonyms":{
          "type": "synonym",
          "synonyms" : ["henry loyd, henry loid, henry lloyd => henri lloyd"]
        }
      }
    }
  }
}

Обратите внимание, что поле ManufacturerName является мультиполем , которое имеет оба textтип и его родной тип keyword.Таким образом, для точных совпадений и для запросов агрегации вы можете использовать поле keyword, тогда как для этого требования вы можете использовать поле text.

Образец документа:

POST mysomeindex/mydocs/1
{
  "ManufacturerName": "ripcurl"
}

POST mysomeindex/mydocs/2
{
  "ManufacturerName": "henri lloyd"
}

Что делаетasticsearch, когда вы загружаете вышеуказанный документ, он создает токены размером от 3 до 5 и сохраняет их в инвертированном индексе длянапример, `rip, ipc, pcu и т. д. *

. Вы можете выполнить следующий запрос, чтобы увидеть, какие токены создаются:

POST mysomeindex/_analyze
{
  "text": "ripcurl",
  "analyzer": "my_analyzer"
}

Также я бы посоветовал вам посмотреть Edge Ngram токенизатор и посмотрите, подходит ли он лучше для ваших требований.

Запрос:

POST mysomeindex/_search
{
  "query": {
    "match": {
      "ManufacturerName": "rip curl"
    }
  }
}

Ответ:

{
  "took": 2,
  "timed_out": false,
  "_shards": {
    "total": 5,
    "successful": 5,
    "failed": 0
  },
  "hits": {
    "total": 1,
    "max_score": 0.25316024,
    "hits": [
      {
        "_index": "mysomeindex",
        "_type": "mydocs",
        "_id": "1",
        "_score": 0.25316024,
        "_source": {
          "ManufacturerName": "ripcurl"
        }
      }
    ]
  }
}

Запрос на синонимы:

POST mysomeindex/_search
{
  "query": {
    "match": {
      "ManufacturerName": "henri lloyd"
    }
  }
}

Ответ:

{
  "took": 1,
  "timed_out": false,
  "_shards": {
    "total": 5,
    "successful": 5,
    "failed": 0
  },
  "hits": {
    "total": 1,
    "max_score": 2.2784421,
    "hits": [
      {
        "_index": "mysomeindex",
        "_type": "mydocs",
        "_id": "2",
        "_score": 2.2784421,
        "_source": {
          "ManufacturerName": "henry lloyd"
        }
      }
    ]
  }
}

Примечание: Если вы намереваетесь использовать синонимы, то лучше всего, чтобы они были в текстовом файле и добавляли их относительно папки config, как указано здесь

Надеюсь, это поможет!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...