Installazione di Elasticsearch

Come installarlo con Docker?

Per usare elasticsearch impostare il proprio docker-compose.yml in questo modo:

elasticsearch:
  image: docker.elastic.co/elasticsearch/elasticsearch:6.3.2
  container_name: elasticsearch
  volumes:
    - esdata1:/usr/share/elasticsearch/data
  ports:
    - 9200:9200
volumes:
  esdata1:
    driver: local

Impostare la virtual memory del kernel di Linux a 262144

Per poter installare Elasticsearch tramite docker compose bisogna impostare il max_map_count in modo adeguato alle sue esigenze, portando il valore da 65530 a 262144. Per poterlo fare è necessario eseguire nel terminale della macchina il seguente comando:

sudo sysctl -w vm.max_map_count=262144

Attenzione: è importante notare che il comando va eseguito nella macchina che ospita i container e non all’interno del container di elasticsearch.

Impostazioni per Rails

Dopo aver installato normalmente la gemma searchkick bisogna configurare i model.

Configurazioni del model.

Per impostarne correttamente l’uso con Rails è sufficiente inserire nel model su cui si vuole fare ricerca il seguente codice:

searchkick(language: 'italian', callbacks: :async)

Il primo parametro (language) indica la lingua che si vuole usare. Il valore predefinito è l’inglese. Se stai leggendo questo articolo probabilmente sei interessato a impostare il settaggio in italiano.

Il secondo parametro (callbacks) indica la strategia che si vuole utilizzare per l’aggiornamento dei dati. Il valore predefinito prevede una sincronia immediata tramite Rails. L’impostazione predefinita potrebbe quindi rallentare l’esperienza dell’utente finale. In sintesi, quando è possibile, è meglio impostare async.

Indicizzazione degli elementi

Per poter effettuare le ricerche sul model bisogna indicizzarlo. Per poterlo fare è sufficiente usare il metodo reindex. Ad esempio, una volta entrato nella console di Rails è sufficiente scrivere:

Book.reindex

Come posso cercare anche sui model associati?

Per poter cercare anche sui model associati si usa il metodo search_data aggiungendo agli attributi i valori che si vogliono aggiungere nella ricerca. Per esempio in un model Book per cercare anche sui model esterni autori (author), soggetti (subjects) ed editore dei libri (publisher) si può impostare il model nel seguente modo:

# model/book.rb
def search_data
  attributes.merge(author_name: author(&:name)
                publisher_name: publisher(&:name)
                 subjects_name: subjects.map(&:name))
end

Come posso cercare?

Per poter cercare attraverso il model basta usare il metodo di istanza search sul model. Ad esempio:

Book.search("titolo del libro")

Fonti