Частичный поиск с Mongodb в приложении Rails с Elasticsearch - PullRequest
0 голосов
/ 10 марта 2019

Я пытаюсь внедрить Elasticsearch для частичного поиска по моим полям.Я создал приложение Rails, используя Mongodb для базы данных.Я реализовал Elasticsearch и могу успешно искать полный текст.Однако я готов внести изменения для частичного поиска.

После настройки, установленной в моем приложении:

Gemfile:

gem 'mongoid', '~> 6.0'
gem 'mongoid-elasticsearch'

app / models / post.rb

class Post
  include Mongoid::Document
  include Mongoid::Timestamps
  include Mongoid::Elasticsearch

  elasticsearch!({
            index_name: 'post_indexes',
             prefix_name: false,
             index_options: {
              filter:{
                autocomplete_filter:{
                  type: "edge_ngram",
                  min_gram: 3,
                  max_gram: 20
                }
               },
               analyzer:{
                   autocomplete:{
                     type: "custom",
                     tokenizer: "standard",
                     filter: [
                       "lowercase",
                       "autocomplete_filter"
                     ]
                 }
               }
             },
             index_mappings: {
               posts:{
                 properties:{
                   title:    { type: 'string', index: :not_analyzed },
                   content:  { type: 'string' }
                 }
               }
             },
             wrapper: :load
           })

  field :title, type: String
  field :content, type: String
end

Здесьэто ссылка Я следую.

Обновление 1

Вот что я попробовал в отображениях:

title:    { type: 'string', index: :not_analyzed, analyzer: "autocomplete" },

Но все же я неполучить O / P.Я также обновил индекс, используя Post.es.index.refresh

Обновление 2

Вот что я пытался решить ошибку:

Elasticsearch::Transport::Transport::Errors::BadRequest: [400] {"error":"MapperParsingException[mapping [post]]; nested: MapperParsingException[Analyzer [autocomplete] not found for field [title]]; ","status":400}

elasticsearch!({
                   index_name: 'mongo_post_indexes',
                   prefix_name: false,
                   index_options: {
                     settings: {
                       index:{
                         analysis:{
                           filter:{
                             autocomplete_filter:{
                               type: "ngram",
                               min_gram: 1,
                               max_gram: 20
                             }
                           },
                           analyzer:{
                             autocomplete:{
                               type: "custom",
                               tokenizer: "standard",
                               filter: [
                                  "lowercase",
                                  "autocomplete_filter"
                                ]
                             }
                           }
                         }
                       }
                     },
                     mappings: {
                      "posts" => {
                        properties: {
                          title: {type: 'text', boost: 10, analyzer: 'autocomplete'},
                          tags: {type: 'string', analyzer: 'autocomplete'}
                        }
                      }
                    }
                   },
                   wrapper: :load
                 })

1 Ответ

1 голос
/ 10 марта 2019

Как OP, размещенный в комментарии, если индекс содержит Tesla, то поиск tes должен дать результат.

Одна вещь, которую я заметил в вашем отображении индекса, это то, что в поле title не используется какой-либо анализатор, а в поле content также не используется пользовательский анализатор, который вы создали для функции автозаполнения, поэтому по умолчанию он будет использовать standard анализатор.

Можете ли вы проверить токены, сгенерированные для этих 2 полей, используя _analyze api https://www.elastic.co/guide/en/elasticsearch/reference/current/indices-analyze.html и сообщить мне O / P этого.

Если он не генерирует токены, как показано ниже для Tesla, то для вашего запроса предполагается, что вы используете запрос match или term (на вопрос, какой запрос используется OP): -

tes, tesl, tesla

Дайте мне знать, если у вас есть какие-либо вопросы.

Редактировать: - Был чат с OP и обнаружил, что он не формирует правильный запрос для автозаполнения. Ниже приведен фрагмент чата, который должен решить проблему.

ваш запрос не возвращает результат, который вы используете Post.es.search («Tes») для автозаполнения поиска, в то время как «Post» не содержать анализатор автозаполнения, вы должны вместо этого использовать Posts.es.search ("Tes") (уведомление s в сообщении) для автозаполнения поиска

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