Introducing Elastic Search
Elastic Search is an optimal database for searching. Elastic Search comes with Kibana, Logstash forming ELK Stack which is highly appreciated in the field of search engine, log. So this series of articles will help you get acquainted with this technology, starting from environment installation to code.
Install the environment
To simplify the installation process, I will install Elastic Search on docker. Create a docker network
1 2 | docker network create elasticnet |
Create the elaticsearch container.
1 2 | docker run -d --name elasticsearch --net elasticnet -p <span class="token number">9200</span> :9200 -e <span class="token string">"discovery.type=single-node"</span> elasticsearch:7.8.1 |
Create a kibana container.
1 2 | docker run -d --name kibana --net elasticnet -p <span class="token number">5601</span> :5601 kibana:7.8.1 |
If you are familiar with docker then the two commands above are completely familiar. The simple explanation is that we will pull the elasticsearh image back to the machine, attach it to a network named elasticnet and expose port 9200 on the host machine, and the same is true of kibana.
From next time on, to run the environment, simply typing on the console is easy to start up elasticsearch and kibana.
1 2 | docker start elasticsearch kibana |
Check if the container is running or not
1 2 | docker <span class="token function">ps</span> |
It is successful if there are two containers, elasticsearch and kibana. Go to http: // localhost: 9200 to make sure Elastic Search server is up and running.
Manipulating with Elasticsearch on a kibana devtool.
Access to devtool on kibana: http: // localhost: 5601 / app / kibana # / dev_tools / console
Create an index named person (it can be considered creating a table in other databases). Note the lowercase index name.
1 2 | PUT /person |
Create a record on Elastic search with index person.
1 2 3 4 5 6 7 | POST /todo/doc/4 { "Name": "Minh Nguyễn Hữu", "Address": "Trần Phú hà nội", "Age": 25 } |
Result
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | <span class="token punctuation">{</span> <span class="token property">"_index"</span> <span class="token operator">:</span> <span class="token string">"person"</span> <span class="token punctuation">,</span> <span class="token property">"_type"</span> <span class="token operator">:</span> <span class="token string">"_doc"</span> <span class="token punctuation">,</span> <span class="token property">"_id"</span> <span class="token operator">:</span> <span class="token string">"J4wlKnQB0I9nZsO-qYTB"</span> <span class="token punctuation">,</span> <span class="token property">"_version"</span> <span class="token operator">:</span> <span class="token number">1</span> <span class="token punctuation">,</span> <span class="token property">"result"</span> <span class="token operator">:</span> <span class="token string">"created"</span> <span class="token punctuation">,</span> <span class="token property">"_shards"</span> <span class="token operator">:</span> <span class="token punctuation">{</span> <span class="token property">"total"</span> <span class="token operator">:</span> <span class="token number">2</span> <span class="token punctuation">,</span> <span class="token property">"successful"</span> <span class="token operator">:</span> <span class="token number">1</span> <span class="token punctuation">,</span> <span class="token property">"failed"</span> <span class="token operator">:</span> <span class="token number">0</span> <span class="token punctuation">}</span> <span class="token punctuation">,</span> <span class="token property">"_seq_no"</span> <span class="token operator">:</span> <span class="token number">1</span> <span class="token punctuation">,</span> <span class="token property">"_primary_term"</span> <span class="token operator">:</span> <span class="token number">1</span> <span class="token punctuation">}</span> |
You can see that the record’s key field is _id. To update the record, use PUT.
1 2 3 4 5 6 7 | POST /todo/doc/{id của bản ghi} { "Name": "Minh Nguyễn Hữu", "Address": "Trần Phú hà nội", "Age": 25 } |
The command to get all records
1 2 3 4 5 6 7 | GET /person/_search { "query": { "match_all": {} } } |
Result
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 | <span class="token punctuation">{</span> <span class="token property">"took"</span> <span class="token operator">:</span> <span class="token number">656</span> <span class="token punctuation">,</span> <span class="token property">"timed_out"</span> <span class="token operator">:</span> <span class="token boolean">false</span> <span class="token punctuation">,</span> <span class="token property">"_shards"</span> <span class="token operator">:</span> <span class="token punctuation">{</span> <span class="token property">"total"</span> <span class="token operator">:</span> <span class="token number">1</span> <span class="token punctuation">,</span> <span class="token property">"successful"</span> <span class="token operator">:</span> <span class="token number">1</span> <span class="token punctuation">,</span> <span class="token property">"skipped"</span> <span class="token operator">:</span> <span class="token number">0</span> <span class="token punctuation">,</span> <span class="token property">"failed"</span> <span class="token operator">:</span> <span class="token number">0</span> <span class="token punctuation">}</span> <span class="token punctuation">,</span> <span class="token property">"hits"</span> <span class="token operator">:</span> <span class="token punctuation">{</span> <span class="token property">"total"</span> <span class="token operator">:</span> <span class="token punctuation">{</span> <span class="token property">"value"</span> <span class="token operator">:</span> <span class="token number">3</span> <span class="token punctuation">,</span> <span class="token property">"relation"</span> <span class="token operator">:</span> <span class="token string">"eq"</span> <span class="token punctuation">}</span> <span class="token punctuation">,</span> <span class="token property">"max_score"</span> <span class="token operator">:</span> <span class="token number">1.0</span> <span class="token punctuation">,</span> <span class="token property">"hits"</span> <span class="token operator">:</span> <span class="token punctuation">[</span> <span class="token punctuation">{</span> <span class="token property">"_index"</span> <span class="token operator">:</span> <span class="token string">"person"</span> <span class="token punctuation">,</span> <span class="token property">"_type"</span> <span class="token operator">:</span> <span class="token string">"doc"</span> <span class="token punctuation">,</span> <span class="token property">"_id"</span> <span class="token operator">:</span> <span class="token string">"JIwlKnQB0I9nZsO-jYT1"</span> <span class="token punctuation">,</span> <span class="token property">"_score"</span> <span class="token operator">:</span> <span class="token number">1.0</span> <span class="token punctuation">,</span> <span class="token property">"_source"</span> <span class="token operator">:</span> <span class="token punctuation">{</span> <span class="token property">"Name"</span> <span class="token operator">:</span> <span class="token string">"Minh Nguyễn Hữu"</span> <span class="token punctuation">,</span> <span class="token property">"Address"</span> <span class="token operator">:</span> <span class="token string">"Trần Phú hà nội"</span> <span class="token punctuation">,</span> <span class="token property">"Age"</span> <span class="token operator">:</span> <span class="token number">25</span> <span class="token punctuation">}</span> <span class="token punctuation">}</span> <span class="token punctuation">,</span> <span class="token punctuation">{</span> <span class="token property">"_index"</span> <span class="token operator">:</span> <span class="token string">"person"</span> <span class="token punctuation">,</span> <span class="token property">"_type"</span> <span class="token operator">:</span> <span class="token string">"doc"</span> <span class="token punctuation">,</span> <span class="token property">"_id"</span> <span class="token operator">:</span> <span class="token string">"J4wlKnQB0I9nZsO-qYTB"</span> <span class="token punctuation">,</span> <span class="token property">"_score"</span> <span class="token operator">:</span> <span class="token number">1.0</span> <span class="token punctuation">,</span> <span class="token property">"_source"</span> <span class="token operator">:</span> <span class="token punctuation">{</span> <span class="token property">"Name"</span> <span class="token operator">:</span> <span class="token string">"Minh Nguyễn Hữu"</span> <span class="token punctuation">,</span> <span class="token property">"Address"</span> <span class="token operator">:</span> <span class="token string">"Trần Phú hà nội"</span> <span class="token punctuation">,</span> <span class="token property">"Age"</span> <span class="token operator">:</span> <span class="token number">25</span> <span class="token punctuation">}</span> <span class="token punctuation">}</span> <span class="token punctuation">,</span> <span class="token punctuation">{</span> <span class="token property">"_index"</span> <span class="token operator">:</span> <span class="token string">"person"</span> <span class="token punctuation">,</span> <span class="token property">"_type"</span> <span class="token operator">:</span> <span class="token string">"doc"</span> <span class="token punctuation">,</span> <span class="token property">"_id"</span> <span class="token operator">:</span> <span class="token string">"2YwsKnQB0I9nZsO--oRo"</span> <span class="token punctuation">,</span> <span class="token property">"_score"</span> <span class="token operator">:</span> <span class="token number">1.0</span> <span class="token punctuation">,</span> <span class="token property">"_source"</span> <span class="token operator">:</span> <span class="token punctuation">{</span> <span class="token property">"Name"</span> <span class="token operator">:</span> <span class="token string">"Minh Đặng Hữu"</span> <span class="token punctuation">,</span> <span class="token property">"Address"</span> <span class="token operator">:</span> <span class="token string">"Trần Cung hà nội"</span> <span class="token punctuation">,</span> <span class="token property">"Age"</span> <span class="token operator">:</span> <span class="token number">22</span> <span class="token punctuation">}</span> <span class="token punctuation">}</span> <span class="token punctuation">]</span> <span class="token punctuation">}</span> <span class="token punctuation">}</span> |
It can be seen that each record returned will have the score shown in the _score field, with this field we can see the match of the result with the search condition. In the case of all, _score equals 1.
The command searches for a field
1 2 3 4 5 6 7 8 9 | GET /person/_search { "query": { "match": { "Name": "minh đặng" } } } |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 | <span class="token punctuation">{</span> <span class="token property">"took"</span> <span class="token operator">:</span> <span class="token number">2</span> <span class="token punctuation">,</span> <span class="token property">"timed_out"</span> <span class="token operator">:</span> <span class="token boolean">false</span> <span class="token punctuation">,</span> <span class="token property">"_shards"</span> <span class="token operator">:</span> <span class="token punctuation">{</span> <span class="token property">"total"</span> <span class="token operator">:</span> <span class="token number">1</span> <span class="token punctuation">,</span> <span class="token property">"successful"</span> <span class="token operator">:</span> <span class="token number">1</span> <span class="token punctuation">,</span> <span class="token property">"skipped"</span> <span class="token operator">:</span> <span class="token number">0</span> <span class="token punctuation">,</span> <span class="token property">"failed"</span> <span class="token operator">:</span> <span class="token number">0</span> <span class="token punctuation">}</span> <span class="token punctuation">,</span> <span class="token property">"hits"</span> <span class="token operator">:</span> <span class="token punctuation">{</span> <span class="token property">"total"</span> <span class="token operator">:</span> <span class="token punctuation">{</span> <span class="token property">"value"</span> <span class="token operator">:</span> <span class="token number">3</span> <span class="token punctuation">,</span> <span class="token property">"relation"</span> <span class="token operator">:</span> <span class="token string">"eq"</span> <span class="token punctuation">}</span> <span class="token punctuation">,</span> <span class="token property">"max_score"</span> <span class="token operator">:</span> <span class="token number">1.1143606</span> <span class="token punctuation">,</span> <span class="token property">"hits"</span> <span class="token operator">:</span> <span class="token punctuation">[</span> <span class="token punctuation">{</span> <span class="token property">"_index"</span> <span class="token operator">:</span> <span class="token string">"person"</span> <span class="token punctuation">,</span> <span class="token property">"_type"</span> <span class="token operator">:</span> <span class="token string">"doc"</span> <span class="token punctuation">,</span> <span class="token property">"_id"</span> <span class="token operator">:</span> <span class="token string">"2YwsKnQB0I9nZsO--oRo"</span> <span class="token punctuation">,</span> <span class="token property">"_score"</span> <span class="token operator">:</span> <span class="token number">1.1143606</span> <span class="token punctuation">,</span> <span class="token property">"_source"</span> <span class="token operator">:</span> <span class="token punctuation">{</span> <span class="token property">"Name"</span> <span class="token operator">:</span> <span class="token string">"Minh Đặng Hữu"</span> <span class="token punctuation">,</span> <span class="token property">"Address"</span> <span class="token operator">:</span> <span class="token string">"Trần Cung hà nội"</span> <span class="token punctuation">,</span> <span class="token property">"Age"</span> <span class="token operator">:</span> <span class="token number">22</span> <span class="token punctuation">}</span> <span class="token punctuation">}</span> <span class="token punctuation">,</span> <span class="token punctuation">{</span> <span class="token property">"_index"</span> <span class="token operator">:</span> <span class="token string">"person"</span> <span class="token punctuation">,</span> <span class="token property">"_type"</span> <span class="token operator">:</span> <span class="token string">"doc"</span> <span class="token punctuation">,</span> <span class="token property">"_id"</span> <span class="token operator">:</span> <span class="token string">"JIwlKnQB0I9nZsO-jYT1"</span> <span class="token punctuation">,</span> <span class="token property">"_score"</span> <span class="token operator">:</span> <span class="token number">0.13353139</span> <span class="token punctuation">,</span> <span class="token property">"_source"</span> <span class="token operator">:</span> <span class="token punctuation">{</span> <span class="token property">"Name"</span> <span class="token operator">:</span> <span class="token string">"Minh Nguyễn Hữu"</span> <span class="token punctuation">,</span> <span class="token property">"Address"</span> <span class="token operator">:</span> <span class="token string">"Trần Phú hà nội"</span> <span class="token punctuation">,</span> <span class="token property">"Age"</span> <span class="token operator">:</span> <span class="token number">25</span> <span class="token punctuation">}</span> <span class="token punctuation">}</span> <span class="token punctuation">,</span> <span class="token punctuation">{</span> <span class="token property">"_index"</span> <span class="token operator">:</span> <span class="token string">"person"</span> <span class="token punctuation">,</span> <span class="token property">"_type"</span> <span class="token operator">:</span> <span class="token string">"doc"</span> <span class="token punctuation">,</span> <span class="token property">"_id"</span> <span class="token operator">:</span> <span class="token string">"J4wlKnQB0I9nZsO-qYTB"</span> <span class="token punctuation">,</span> <span class="token property">"_score"</span> <span class="token operator">:</span> <span class="token number">0.13353139</span> <span class="token punctuation">,</span> <span class="token property">"_source"</span> <span class="token operator">:</span> <span class="token punctuation">{</span> <span class="token property">"Name"</span> <span class="token operator">:</span> <span class="token string">"Minh Nguyễn Hữu"</span> <span class="token punctuation">,</span> <span class="token property">"Address"</span> <span class="token operator">:</span> <span class="token string">"Trần Phú hà nội"</span> <span class="token punctuation">,</span> <span class="token property">"Age"</span> <span class="token operator">:</span> <span class="token number">25</span> <span class="token punctuation">}</span> <span class="token punctuation">}</span> <span class="token punctuation">]</span> <span class="token punctuation">}</span> <span class="token punctuation">}</span> |
In this case, we can clearly see, the first record has the highest score (because 2 words are identical with the search criteria, compared to the 2 records below, it is only 1). However, the scoring principle is based on many other factors that we will learn later in this article.
Conclusion
So we learned how to install Elastic Search in a development environment and some basic query commands through Devtool. Next time, we will learn how to integrate the NEST library (A library that makes Elastic Search accessible from C # easy) into the ASP .NET Core project.