0

Я не могу понять, почему elasticsearch не ищет индексы not_analysed. У меня есть следующие настройки в моей модели:Elasticsearch не работает с индексом «not_analyzed»

settings index: { number_of_shards: 1 } do 
     mappings dynamic: 'false' do 
     indexes :id 
     indexes :name, index: 'not_analyzed' 
     indexes :email, index: 'not_analyzed' 
     indexes :contact_number 
     end 
    end 

    def as_indexed_json(options = {}) 
     as_json(only: [ :id, :name, :username, :user_type, :is_verified, :email, :contact_number ]) 
    end 

И мое картирование в elasticsearch правильное, как показано ниже.

{ 
    "users-development" : { 
    "mappings" : { 
     "user" : { 
     "dynamic" : "false", 
     "properties" : { 
      "contact_number" : { 
      "type" : "string" 
      }, 
      "email" : { 
      "type" : "string", 
      "index" : "not_analyzed" 
      }, 
      "id" : { 
      "type" : "string" 
      }, 
      "name" : { 
      "type" : "string", 
      "index" : "not_analyzed" 
      } 
     } 
     } 
    } 
    } 
} 

Но проблема, когда я делаю поиск по не проанализированному полю (имя и адрес электронной почты, так как я хотел, чтобы они были не анализировались), то искать только полное слово. Как в приведенном ниже примере, он должен вернуть Джона, Джонни и Тигра, все 3 записи. Но он возвращает только 2 записи.

Я ищу, как показано ниже

settings = { 
    query: { 
     filtered: { 
     filter: { 
      bool: { 
      must: [ 
       { terms: { name: [ "john", "tiger" ] } }, 
      ] 
      } 
     } 
     } 
    }, 
    size: 10 
    } 

    User.__elasticsearch__.search(settings).records 

Это, как я создаю индекс на моем пользовательском объекте в функции обратного вызова after_save,

User.__elasticsearch__.client.indices.create(
       index: User.index_name, 
       id: self.id, 
       body: self.as_indexed_json, 
      ) 

Некоторые из документа, который должен соответствовать

[{ 
     "_index" : "users-development", 
     "_type" : "user", 
     "_id" : "670", 
     "_score" : 1.0, 
     "_source":{"id":670,"email":"[email protected]","name":"john baba","contact_number":null} 
    }, 
    { 
      "_index" : "users-development", 
      "_type" : "user", 
      "_id" : "671", 
      "_score" : 1.0, 
      "_source":{"id":671,"email":"[email protected]","name":"Johny Rocket","contact_number":null} 
     } 

    , { 
      "_index" : "users-development", 
      "_type" : "user", 
      "_id" : "736", 
      "_score" : 1.0, 
      "_source":{"id":736,"email":"[email protected]","name":"tiger sherof", "contact_number":null} 
     } ] 

Любые предложения, пожалуйста.

+0

Что такое user_type в запросе выше? – Richa

+0

как вы указали? «Джон» или «Джон»? не могли бы вы показать нам документ, который, по вашему мнению, должен совпадать? – ChintanShah25

+0

@ ChintanShah25 добавил документы, которые должны соответствовать –

ответ

0

Я думаю, что вы бы получить желаемый результат с keyword toknizer в сочетании с lowercase filter, а не с помощью not_analyzed.

Причина: john* не соответствует Johny был обусловлен чувствительностью к случаю. Эта установка будет работать

{ 
    "settings": { 
    "analysis": { 
     "analyzer": { 
     "keyword_analyzer": { 
      "type": "custom", 
      "filter": [ 
      "lowercase" 
      ], 
      "tokenizer": "keyword" 
     } 
     } 
    } 
    }, 
    "mappings": { 
    "my_type": { 
     "properties": { 
     "name": { 
      "type": "string", 
      "analyzer": "keyword_analyzer" 
     } 
     } 
    } 
    } 
} 

Теперь джон * будет соответствовать Джони. Вы должны использовать multi-fields, если у вас есть различные требования. terms query для john wont дать вам john baba как внутри инвертированный индекс нет токена как john. Вы можете использовать стандартный анализатор на одном поле и анализатор ключевых слов на другом.

0

Согласно документации term query

Термина запрос находит документы, которые содержат точный срок, указанный в инвертированном индексе.

Вы ищете john, но ни один из ваших documnents не содержат john то есть, почему вы не получали никакого результата. Либо вы можете указать свое поле analysed, а затем применить query string или выполнить поиск точного срока.

https://www.elastic.co/guide/en/elasticsearch/reference/2.x/query-dsl-term-query.html см для более подробной информации