Elasticsearch Стеммер запрос наiveive_english не возвращает хитов - PullRequest
0 голосов
/ 06 октября 2019

Мне удалось найти этот другой вопрос: Использование stemmer_english в Elasticsearch , но прошло уже 3 года с тех пор, как на нем была какая-либо активность

Я пытаюсь заставить эластичный поиск игнорировать'при индексации и поиске. Например:

POST my_index/_doc/
{
  "message" : "Mike's bike"
}

Я хочу иметь возможность искать этот документ с помощью «mikes», «mike's», «mike». Я посмотрел и подумал, что possessive_english должен выполнить эту задачу, но мне не удалось получить ожидаемые результаты.

Я создал индекс с помощью

PUT /my_index
{
  "settings": {
    "analysis": {
      "analyzer": {
        "rebuilt_standard": {
          "tokenizer": "standard",
          "filter": [
            "lowercase", "my_stemmer"      
          ]
        }
      },
      "filter": {
        "my_stemmer":{
          "type": "stemmer",
          "language": "possessive_english"
        }
      }
    }
  }
}

Я протестировал анализатор с помощью

POST /my_index/_analyze
{
  "analyzer": "rebuilt_standard",
  "text": "Mike's bike"
}

И вот результат

{
  "tokens" : [
    {
      "token" : "mike",
      "start_offset" : 0,
      "end_offset" : 6,
      "type" : "<ALPHANUM>",
      "position" : 0
    },
    {
      "token" : "bike",
      "start_offset" : 7,
      "end_offset" : 11,
      "type" : "<ALPHANUM>",
      "position" : 1
    }
  ]
}

Похоже, анализатор работает. Затем я вставил документ с:

POST my_index/_doc/
{
  "message" : "Mike's bike"
}

При поиске он вернул 0 результатов

GET /my_index/_search
{
    "query": {
        "match": {"message": "mike"}
    }
}
GET /my_index/_search
{
    "query": {
        "match": {"message": "mikes"}
    }
}

, но

GET /my_index/_search
{
    "query": {
        "match": {"message": "mike's"}
    }
}

вернул результаты

Кажется, что я пропускаю конфигурацию на стороне сопоставления вещей из связанного вопроса, но я не уверен, как ее установить.

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

Я выложу их на всякий случай

  include Elasticsearch::Persistence::Repository
  include Elasticsearch::Persistence::Repository::DSL

  client = Elasticsearch::Client.new(url: 'http://localhost:9200', log: true)

  settings index: {
      number_of_shards: 1,
      analysis: {
          analyzer: {
              custom: {
                  type: "custom",
                  tokenizer: "standard",
                  filter: [
                      "lowercase",
                      "english_possessive_stemmer",
                  ]
              }
          },
          filter: {
              english_possessive_stemmer: {
                  type: "stemmer",
                  language: "possessive_english",
              }
          }
      }
  }
  mappings {
    indexes :icon, index: false
    indexes :properties, type: 'nested' do
      indexes :values
    end
    indexes :name
  }

в контроллере

repository = Repository.new
repository.create_index!(force: true)
repository.save(json)
results = repository.search(query: { match: { name: 'Mikes' } })

1 Ответ

0 голосов
/ 07 октября 2019

Ваш анализатор работает нормально. Я думаю, что вы не применили его к своему отображению

PUT /my_index
{
  "settings": {
    "analysis": {
      "analyzer": {
        "rebuilt_standard": {
          "tokenizer": "standard",
          "filter": [
            "lowercase", "my_stemmer","english_stemmer"      
          ]
        }
      },
      "filter": {
        "my_stemmer":{
          "type": "stemmer",
          "language": "possessive_english"
        },
         "english_stemmer": {
          "type": "stemmer",
          "language": "english" 
        }
      }
    }
  },
  "mappings": {
    "properties": {
      "message":{
        "type": "text",
        "analyzer": "rebuilt_standard" ---> pass the analyzer
      }
    }
  }
}

ФильтрВам нужно будет использовать stemmer, который сокращает слова до их базовой формы.

У меня есть отличная статья здесь для дальнейшего использования.

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