Английский анализатор (stemming) в ElasticSearch не работает - PullRequest
0 голосов
/ 24 января 2019

Я попытался применить собственный анализатор английского языка, а также стандартный анализатор английского языка вasticsearch. Моя цель особенно использовать стемминг. Допустим, в моих документах есть следующие слова: обложки, впечатление.

Теперь, если я ищу, например, Обложка или впечатления или впечатления, я получаю 0 результатов. Только если я буду искать точные термины «обложки» или «показ», я попаду в результаты.

Это мои настройки вasticsearch (согласно этой документации https://www.elastic.co/guide/en/elasticsearch/reference/current/analysis-lang-analyzer.html):

{
  "settings": {
    "analysis": {
      "filter": {
        "english_stop": {
          "type":       "stop",
          "stopwords":  "_english_" 
        },
        "english_stemmer": {
          "type":       "stemmer",
          "language":   "english"
        },
        "english_possessive_stemmer": {
          "type":       "stemmer",
          "language":   "possessive_english"
        }
      },
      "analyzer": {
        "rebuilt_english": {
          "tokenizer":  "standard",
          "filter": [
            "english_possessive_stemmer",
            "lowercase",
            "english_stop",
            "english_stemmer"
          ]
        }
      }
    }
  }
}

Мое отображение выглядит следующим образом:

"mapping": {
  "_doc": {
     "properties": {
        "title": {"type": "text",
                   "analyzer": "rebuilt_english"},
        "description: {"type": text"
                       "analyzer": "rebuilt_english"}
  }
 }
}

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

{
  "settings": {
    "analysis": {
    "analyzer: "rebuilt_english" {
    "type": "custom",
     "filter": #and so on...

Мне что-то здесь не хватает? Насколько я понимаю, мне нужно установить настройки для конкретного анализатора в «настройках», дать ему имя и затем использовать это имя в свойствах «отображения», чтобы каждый элемент анализировался в соответствии с настройками, установленными выше.

Я также пытался не устанавливать какие-либо конкретные настройки, а просто установить свойства анализатора (в сопоставлении) для каждого элемента, например:

"title": {"type": "text",
"analyzer": "english"}

Что также не работает (даже при использовании фильтров, таких как stemming).

Я действительно часами пытался найти решение, но не могу заставить его работать. Помощь будет высоко ценится. Спасибо!

UPDATE

Это код, который я использовал для создания индекса (моя последняя попытка, согласно моему описанию, я также пробовал другие способы применения метода):

PUT /my_index

{
  "settings": {
    "analysis": {
      "analyzer": {
        "rebuilt_english": {
          "type": "custom",
      "filter": {
        "english_stop": {
          "type": "stop",
          "stopwords": "_english"
        },
        "english_stemmer": {
          "type": "stemmer",
          "language": "english"
        },
        "english_possessive_stemmer": {
          "type": "stemmer",
          "language": "possessive_english"
        },
          "tokenizer": "standard",
          "filter": [
            "english_possessive_stemmer",
            "lowercase",
            "english_stop",
            "english_stemmer"
            ]
        }
      }
    }
  },
  "mappings": {
    "_doc": {
      "properties": {
        "title": { "type": "text",
          "analyzer": "rebuilt_english"
        },
        "description": { "type": "text",
                    "analyzer": "rebuilt_english"}
                    }
        }
      }
    }
}

Ответы [ 2 ]

0 голосов
/ 11 апреля 2019
PUT /my_index
{
  "settings": {
    "analysis": {
      "analyzer": {
        "english_stop": {
          "type":"standard",
          "stopwords": "_english_"
          },
          "my_analyzer": {
            "type":"custom",
            "tokenizer":"standard",
            "filter":["my_stemmer"]
          }
        },
        "filter": {
          "my_stemmer":{
            "type": "stemmer",
            "language": "english"
          }
        }
    }
  }
}

POST /my_index/_analyze
{
  "analyzer": "my_analyzer",
  "text": "I'm in the mood for drinking semi-dry wine!"
}

Я думаю, это поможет. Благодаря.

0 голосов
/ 24 января 2019

Ваша проблема заключалась в том, что у вас был ключ filter, в котором все ваши названные фильтры были в неправильном месте.Он был помещен в analyzer, но должен был быть ключом к analyzer.

. Поэтому я уверен, что следующий конфиг должен работать как положено:

{
  "settings":{
    "analysis":{
      "filter":{
        "english_stop":{
          "type":"stop",
          "stopwords":"_english"
        },
        "english_stemmer":{
          "type":"stemmer",
          "language":"english"
        },
        "english_possessive_stemmer":{
          "type":"stemmer",
          "language":"possessive_english"
        }
      },
      "analyzer":{
        "rebuilt_english":{
          "type":"custom",
          "tokenizer":"standard",
          "filter":[
            "english_possessive_stemmer",
            "lowercase",
            "english_stop",
            "english_stemmer"
          ]
        }
      }
    },
    "mappings":{
      "_doc":{
        "properties":{
          "title":{
            "type":"text",
            "analyzer":"rebuilt_english"
          },
          "description":{
            "type":"text",
            "analyzer":"rebuilt_english"
          }
        }
      }
    }
  }
}
...