{"id":427,"date":"2020-02-21T11:24:29","date_gmt":"2020-02-21T11:24:29","guid":{"rendered":"https:\/\/www.samarthya.me\/wps\/?p=427"},"modified":"2020-02-24T11:24:17","modified_gmt":"2020-02-24T11:24:17","slug":"elasticsearch-v7-6","status":"publish","type":"post","link":"https:\/\/blog.samarthya.me\/wps\/2020\/02\/21\/elasticsearch-v7-6\/","title":{"rendered":"Elasticsearch v7.6"},"content":{"rendered":"\n<p>What I have been doing is evaluating Elasticsearch. The indexing, searching (Phrase, Similarity, Structured, Full Text, Complex), clustering etc. In this blog I will just try and simplify the learning curve.<\/p>\n\n\n\n<h2 class=\"has-vivid-red-color has-text-color wp-block-heading\" id=\"ElasticStack-WhatisElasticsearch?\">Q &#8211; 1 What is Elasticsearch?<\/h2>\n\n\n\n<ul class=\"wp-block-list\"><li>Distributed document store for complex datastore serialised as JSON<\/li><li>Accessible from any of the member nodes.<\/li><li>Uses Inverted index.<\/li><li>Indexes all data in every field.<\/li><li>Every field has a dedicated. optimised data store.<\/li><li>Text is stored in inverted indexes.<\/li><li>Numeric and Geo points in BKD trees.<\/li><li>Based on Apache lucene.<\/li><li>Can execute structured, full text and complex queries.<\/li><\/ul>\n\n\n\n<h2 class=\"has-vivid-red-color has-text-color wp-block-heading\">Q- 2 What is an index?<\/h2>\n\n\n\n<ul class=\"wp-block-list\"><li>Index is a logical grouping of physical shards.<\/li><li>Single document may be distributed across multiple shards.<\/li><li>Shards can be primaries or replicas.<\/li><li>Each document belongs to one primary shard.<\/li><li>Number of primary shards are fixed at the time of index creation.<\/li><li>Number of replicas shards can be changed anytime.<\/li><\/ul>\n\n\n\n<blockquote class=\"wp-block-quote is-style-large is-layout-flow wp-block-quote-is-layout-flow\"><p><a href=\"https:\/\/localhost:9200\/_cat\/health?v\">https:\/\/myserver.elastic.com:9200\/_cat\/health?v<\/a><\/p><cite>Returns information about your cluster<\/cite><\/blockquote>\n\n\n\n<pre class=\"wp-block-preformatted\">epoch                  1582199918   \ntimestamp              11:58:38\ncluster                samarthya-cluster\nstatus                 yellow\nnode.total             4\nnode.data              4\nshards                 108\npri                    64\nrelo                   0\ninit                   0\nunassign               17\npending_tasks          0\nmax_task_wait_time     -\nactive_shards_percent.  86.4%<\/pre>\n\n\n\n<h2 class=\"wp-block-heading\">Action Time<\/h2>\n\n\n\n<ol class=\"wp-block-list\"><li>Let&#8217;s add a document into an index.<\/li><\/ol>\n\n\n\n<div class=\"wp-block-group\"><div class=\"wp-block-group__inner-container is-layout-flow wp-block-group-is-layout-flow\">\n<p>The most powerful aspect of elasticsearch is <a href=\"http:\/\/One of the most important features of Elasticsearch is that it tries to get out of your way and let you start exploring your data as quickly as possible. To index a document, you don\u2019t have to first create an index, define a mapping type, and define your fields\u2009\u2014\u2009you can just index a document and the index, type, and fields will spring to life automatically:\">Dynamic Mapping<\/a> (more details below) which allows you to explore your data as quickly as possible. <\/p>\n\n\n\n<p>To index a document, you don\u2019t have to first create an index, define a mapping type, and define your fields\u2009\u2014\u2009you can just index a document and the index, type, and fields will spring to life automatically<\/p>\n\n\n\n<p>In the command below I am trying to issue a request for a document with <code>_id<\/code> 1.<\/p>\n\n\n\n<h4 class=\"wp-block-heading\">1. GET \/profile\/_doc\/1<\/h4>\n\n\n\n<p>A sample request for an index <code>profile<\/code> which does not exists at the moment.<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\"> {\n   \"error\" : {\n     \"root_cause\" : [\n       {\n         \"type\" : \"index_not_found_exception\",\n         \"reason\" : \"no such index [profile]\",\n         \"resource.type\" : \"index_expression\",\n         \"resource.id\" : \"profile\",\n         \"index_uuid\" : \"<em>na<\/em>\",\n         \"index\" : \"profile\"\n       }\n     ],\n     \"type\" : \"index_not_found_exception\",\n     \"reason\" : \"no such index [profile]\",\n     \"resource.type\" : \"index_expression\",\n     \"resource.id\" : \"profile\",\n     \"index_uuid\" : \"<em>na<\/em>\",\n     \"index\" : \"profile\"\n   },\n   \"status\" : 404\n }\n<\/pre>\n<\/div><\/div>\n\n\n\n<p>One way to create a non existing index is by using <code>PUT<\/code>. Dynamically the mapping will be put in place and you can execute the <code>GET<\/code> above to see the details.<\/p>\n\n\n\n<h4 class=\"wp-block-heading\">2. PUT \/profile\/_doc\/1<\/h4>\n\n\n\n<div class=\"wp-block-group\"><div class=\"wp-block-group__inner-container is-layout-flow wp-block-group-is-layout-flow\">\n<pre class=\"wp-block-preformatted\">{\n   \"name\": \"Saurabh Sharma\",\n   \"age\": \"60\",\n   \"title\": \"Mr.\",\n   \"role\": \"Tech lead\",\n   \"org\": \"Security\"\n }<\/pre>\n<\/div><\/div>\n\n\n\n<div class=\"wp-block-group\"><div class=\"wp-block-group__inner-container is-layout-flow wp-block-group-is-layout-flow\">\n<p>In case of successful execution you should see an output like under<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">{\n   \"_index\" : \"profile\",\n   \"_type\" : \"_doc\",\n   \"_id\" : \"1\",\n   \"_version\" : 1,\n   <strong>\"result\" : \"created\",<\/strong>\n   \"_shards\" : {\n     <strong>\"total\" : 2,<\/strong>\n     \"successful\" : 1,\n     \"failed\" : 0\n   },\n   \"_seq_no\" : 0,\n   \"_primary_term\" : 1\n }<\/pre>\n<\/div><\/div>\n\n\n\n<p>The document that was passed as JSON body is now successfully indexed.<\/p>\n\n\n\n<blockquote class=\"wp-block-quote is-style-default is-layout-flow wp-block-quote-is-layout-flow\"><p>The automatic detection and addition of new fields is called&nbsp;<em>dynamic mapping<\/em>.<\/p><cite>Dynamic Mapping<\/cite><\/blockquote>\n\n\n\n<h4 class=\"wp-block-heading\">If no body is provided it might throw an error like below.<\/h4>\n\n\n\n<div class=\"wp-block-group\"><div class=\"wp-block-group__inner-container is-layout-flow wp-block-group-is-layout-flow\">\n<pre class=\"wp-block-preformatted\">{\n   \"error\": {\n     \"root_cause\": [\n       {\n         \"type\": \"parse_exception\",\n         \"reason\": \"request body is required\"\n       }\n     ],\n     \"type\": \"parse_exception\",\n     \"reason\": \"request body is required\"\n   },\n   \"status\": 400\n }<\/pre>\n<\/div><\/div>\n\n\n\n<p>If the GET is issued again. It will return the document indexed. You can look at the fields that have an <code>_<\/code> at the start like <code>_type<\/code>, <code>id<\/code>, <code>version<\/code> etc. These are called <a href=\"https:\/\/www.elastic.co\/guide\/en\/elasticsearch\/reference\/current\/mapping-fields.html\">metafields<\/a>.<\/p>\n\n\n\n<h4 class=\"wp-block-heading\">GET \/profile\/_doc\/1<\/h4>\n\n\n\n<div class=\"wp-block-group\"><div class=\"wp-block-group__inner-container is-layout-flow wp-block-group-is-layout-flow\">\n<pre class=\"wp-block-preformatted\">{\n   \"_index\" : \"profile\",\n   \"_type\" : \"_doc\",\n   \"_id\" : \"1\",\n   \"_version\" : 1,\n   \"_seq_no\" : 0,\n   \"_primary_term\" : 1,\n   \"found\" : true,\n   \"_source\" : {\n     \"name\" : \"Saurabh Sharma\",\n     \"age\" : \"60\",\n     \"title\" : \"Mr.\",\n     \"role\" : \"Tech lead\",\n     \"org\" : \"Security\"\n   }\n }<\/pre>\n<\/div><\/div>\n\n\n\n<p>One can use the <a href=\"https:\/\/www.elastic.co\/guide\/en\/elasticsearch\/reference\/7.6\/docs-bulk.html\">BULK API<\/a>, to ingest more than one document.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Search<\/h2>\n\n\n\n<h4 class=\"wp-block-heading\">GET \/profile\/_search<\/h4>\n\n\n\n<div class=\"wp-block-group\"><div class=\"wp-block-group__inner-container is-layout-flow wp-block-group-is-layout-flow\">\n<pre class=\"wp-block-preformatted\">{\n   \"query\": { \"match_all\": {}},\n   \"sort\": [\n     {\n       \"age\": \"asc\"\n     }\n   ]\n }<\/pre>\n<\/div><\/div>\n\n\n\n<p>We hare looking for all the matches and sorting it by age in ascending order.<\/p>\n\n\n\n<h4 class=\"wp-block-heading\">Result : Exception<\/h4>\n\n\n\n<pre class=\"wp-block-preformatted\">{\n   \"error\": {\n     \"root_cause\": [\n       {\n         \"type\": \"illegal_argument_exception\",\n         \"reason\": \"Fielddata is disabled on text fields by default. Set fielddata=true on [age] in order to load fielddata in memory by uninverting the inverted index. Note that this can however use significant memory. Alternatively use a keyword field instead.\"\n       }\n     ],\n     \"type\": \"search_phase_execution_exception\",\n     \"reason\": \"all shards failed\",\n     \"phase\": \"query\",\n     \"grouped\": true,\n     \"failed_shards\": [\n       {\n         \"shard\": 0,\n         \"index\": \"profile\",\n         \"node\": \"mrTQQhMPQfWPF6q_IGfs5Q\",\n         \"reason\": {\n           \"type\": \"illegal_argument_exception\",\n           \"reason\": \"Fielddata is disabled on text fields by default. Set fielddata=true on [age] in order to load fielddata in memory by uninverting the inverted index. Note that this can however use significant memory. Alternatively use a keyword field instead.\"\n         }\n       }\n     ],\n     \"caused_by\": {\n       \"type\": \"illegal_argument_exception\",\n       \"reason\": \"Fielddata is disabled on text fields by default. Set fielddata=true on [age] in order to load fielddata in memory by uninverting the inverted index. Note that this can however use significant memory. Alternatively use a keyword field instead.\",\n       \"caused_by\": {\n         \"type\": \"illegal_argument_exception\",\n         \"reason\": \"Fielddata is disabled on text fields by default. Set fielddata=true on [age] in order to load fielddata in memory by uninverting the inverted index. Note that this can however use significant memory. Alternatively use a keyword field instead.\"\n       }\n     }\n   },\n   \"status\": 400\n }<\/pre>\n\n\n\n<p>If I look at the <a href=\"https:\/\/www.elastic.co\/guide\/en\/elasticsearch\/reference\/7.6\/mapping.html\">mapping<\/a> (Will discuss it later, what it is and how it helps)<\/p>\n\n\n\n<div class=\"wp-block-group\"><div class=\"wp-block-group__inner-container is-layout-flow wp-block-group-is-layout-flow\">\n<h4 class=\"wp-block-heading\">GET profile\/_mapping<\/h4>\n\n\n\n<pre class=\"wp-block-preformatted\">{\n   \"profile\" : {\n     \"mappings\" : {\n       \"properties\" : {\n         \"<strong>age<\/strong>\" : {\n           \"type\" : \"text\",\n           \"fields\" : {\n             \"keyword\" : {\n               \"type\" : \"keyword\",\n               \"ignore_above\" : 256\n             }\n           }\n         },\n         \"<strong>name<\/strong>\" : {\n           \"type\" : \"text\",\n           \"fields\" : {\n             \"keyword\" : {\n               \"type\" : \"keyword\",\n               \"ignore_above\" : 256\n             }\n           }\n         },\n         \"<strong>org<\/strong>\" : {\n           \"type\" : \"text\",\n           \"fields\" : {\n             \"keyword\" : {\n               \"type\" : \"keyword\",\n               \"ignore_above\" : 256\n             }\n           }\n         },\n         \"<strong>role<\/strong>\" : {\n           \"type\" : \"text\",\n           \"fields\" : {\n             \"keyword\" : {\n               \"type\" : \"keyword\",\n               \"ignore_above\" : 256\n             }\n           }\n         },\n         \"<strong>title<\/strong>\" : {\n           \"type\" : \"text\",\n           \"fields\" : {\n             \"keyword\" : {\n               \"type\" : \"keyword\",\n               \"ignore_above\" : 256\n             }\n           }\n         }\n       }\n     }\n   }\n }<\/pre>\n\n\n\n<p>The error that was thrown had the reason specified<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">\"Fielddata is disabled on text fields by default. Set fielddata=true on [age] in order to load fielddata in memory by uninverting the inverted index. Note that this can however use significant memory. Alternatively use a keyword field instead.\"<\/pre>\n<\/div><\/div>\n\n\n\n<div class=\"wp-block-group\"><div class=\"wp-block-group__inner-container is-layout-flow wp-block-group-is-layout-flow\">\n<p>If I look at the <a href=\"https:\/\/www.elastic.co\/guide\/en\/elasticsearch\/reference\/7.6\/keyword.html\">KEYWORD<\/a> definition.<\/p>\n\n\n\n<p class=\"has-background has-very-light-gray-background-color\">They are typically used for filtering (<em>Find me all blog posts where&nbsp;<code>status<\/code>&nbsp;is&nbsp;<code>published<\/code><\/em>), for sorting, and for aggregations. Keyword fields are only searchable by their exact value.<\/p>\n\n\n\n<p>Since the index already exists and if we try and modify the mappings<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">PUT profile\n {\n   \"mappings\":{\n     \"properties\" : {\n         \"age\" : {\n           \"type\": \"keyword\"\n         }\n     }\n   }\n }<\/pre>\n\n\n\n<p class=\"has-background has-luminous-vivid-amber-background-color\">It should throw a response as under.<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">{\n   \"error\": {\n     \"root_cause\": [\n       {\n         \"type\": \"resource_already_exists_exception\",\n         \"reason\": \"index [profile\/aXasR54rR6SvXk-GQd6mRQ] already exists\",\n         \"index_uuid\": \"aXasR54rR6SvXk-GQd6mRQ\",\n         \"index\": \"profile\"\n       }\n     ],\n     \"type\": \"resource_already_exists_exception\",\n     \"reason\": \"index [profile\/aXasR54rR6SvXk-GQd6mRQ] already exists\",\n     \"index_uuid\": \"aXasR54rR6SvXk-GQd6mRQ\",\n     \"index\": \"profile\"\n   },\n   \"status\": 400\n }<\/pre>\n\n\n\n<h2 class=\"wp-block-heading\">How to resolve?<\/h2>\n\n\n\n<p>The <a href=\"https:\/\/www.elastic.co\/guide\/en\/elasticsearch\/reference\/current\/removal-of-types.html\">removal<\/a> of mappings is one way. The other as we un-intentionally used <code>age<\/code> as string when specifying value <code>20<\/code> implying we should delete the index recreate the value.<\/p>\n<\/div><\/div>\n\n\n\n<div class=\"wp-block-group\"><div class=\"wp-block-group__inner-container is-layout-flow wp-block-group-is-layout-flow\">\n<h4 class=\"wp-block-heading\">DELETE profile\/<\/h4>\n\n\n\n<p>You will get an acknowledgment &#8211; True message implying the index has been deleted. If you try and delete it again you will get a message as under<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">{\n   \"error\" : {\n     \"root_cause\" : [\n       {\n         \"type\" : \"index_not_found_exception\",\n         \"reason\" : \"no such index [profile]\",\n         \"index_uuid\" : \"<em>na<\/em>\",\n         \"resource.type\" : \"index_or_alias\",\n         \"resource.id\" : \"profile\",\n         \"index\" : \"profile\"\n       }\n     ],\n     \"type\" : \"index_not_found_exception\",\n     \"reason\" : \"no such index [profile]\",\n     \"index_uuid\" : \"<em>na<\/em>\",\n     \"resource.type\" : \"index_or_alias\",\n     \"resource.id\" : \"profile\",\n     \"index\" : \"profile\"\n   },\n   \"status\" : 404\n }<\/pre>\n<\/div><\/div>\n\n\n\n<div class=\"wp-block-group\"><div class=\"wp-block-group__inner-container is-layout-flow wp-block-group-is-layout-flow\">\n<p>Time to add mapping or use dynamic mapping by supplying right values for the <code>age<\/code> field.<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">PUT \/profile\/_doc\/1\n {\n   \"name\": \"Saptha b\",\n   \"age\": 50,\n   \"title\": \"Mr.\",\n   \"role\": \"Manager\",\n   \"org\": \"Security\"\n }<\/pre>\n\n\n\n<p>It should return the acknowledgment of addition<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">{\n   \"_index\" : \"profile\",\n   \"_type\" : \"_doc\",\n   \"_id\" : \"1\",\n   \"_version\" : 1,\n   \"result\" : \"created\",\n   \"_shards\" : {\n     \"total\" : 2,\n     \"successful\" : 1,\n     \"failed\" : 0\n   },\n   \"_seq_no\" : 0,\n   \"_primary_term\" : 1\n }<\/pre>\n\n\n\n<p>Once that has been established and if we execute the query again you should get the results as under.<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">GET profile\/_search \n {\n   \"query\": {\n     \"match_all\": {}\n   },\n   \"sort\": [\n     {\n       \"age\": \"asc\"\n     }\n   ]\n }<\/pre>\n\n\n\n<h4 class=\"wp-block-heading\">Response<\/h4>\n\n\n\n<p class=\"has-background has-very-light-gray-background-color\">{<br>\n  &#8220;took&#8221; : 3,<br>\n  &#8220;timed_out&#8221; : false,<br>\n  &#8220;_shards&#8221; : {<br>\n    &#8220;total&#8221; : 1,<br>\n    &#8220;successful&#8221; : 1,<br>\n    &#8220;skipped&#8221; : 0,<br>\n    &#8220;failed&#8221; : 0<br>\n  },<br>\n  &#8220;hits&#8221; : {<br>\n    &#8220;total&#8221; : {<br>\n      &#8220;value&#8221; : 2,<br>\n      &#8220;relation&#8221; : &#8220;eq&#8221;<br>\n    },<br>\n    &#8220;max_score&#8221; : null,<br>\n    &#8220;hits&#8221; : [<br>\n      {<br>\n        &#8220;_index&#8221; : &#8220;profile&#8221;,<br>\n        &#8220;_type&#8221; : &#8220;_doc&#8221;,<br>\n        &#8220;_id&#8221; : &#8220;1&#8221;,<br>\n        &#8220;_score&#8221; : null,<br>\n        &#8220;_source&#8221; : {<br>\n          &#8220;name&#8221; : &#8220;Saptha b&#8221;,<br>\n          &#8220;age&#8221; : 50,<br>\n          &#8220;title&#8221; : &#8220;Mr.&#8221;,<br>\n          &#8220;role&#8221; : &#8220;Manager&#8221;,<br>\n          &#8220;org&#8221; : &#8220;Security&#8221;<br>\n        },<br>\n        &#8220;sort&#8221; : [<br>\n          50<br>\n        ]<br>\n      },<br>\n      {<br>\n        &#8220;_index&#8221; : &#8220;profile&#8221;,<br>\n        &#8220;_type&#8221; : &#8220;_doc&#8221;,<br>\n        &#8220;_id&#8221; : &#8220;2&#8221;,<br>\n        &#8220;_score&#8221; : null,<br>\n        &#8220;_source&#8221; : {<br>\n          &#8220;name&#8221; : &#8220;Saurabh Sharma&#8221;,<br>\n          &#8220;age&#8221; : 70,<br>\n          &#8220;title&#8221; : &#8220;Mr.&#8221;,<br>\n          &#8220;role&#8221; : &#8220;Lead Engr&#8221;,<br>\n          &#8220;org&#8221; : &#8220;Security&#8221;<br>\n        },<br>\n        &#8220;sort&#8221; : [<br>\n          70<br>\n        ]<br>\n      }<br>\n    ]<br>\n  }<br>\n}<\/p>\n<\/div><\/div>\n\n\n\n<p>By default, the hits section includes the first 10 documents that match the search criteria.<\/p>\n\n\n\n<div class=\"wp-block-group\"><div class=\"wp-block-group__inner-container is-layout-flow wp-block-group-is-layout-flow\">\n<h3 class=\"wp-block-heading\">Specific search<\/h3>\n\n\n\n<pre class=\"wp-block-preformatted\">GET profile\/_search \n  {\n    \"query\": {\n      \"match\": {\n        \"title\": \"Mr.\"\n      }\n    },\n    \"sort\": [\n      {\n        \"age\": \"asc\"\n      }\n    ],\n    \"size\": 3\n  }<\/pre>\n\n\n\n<p>Here instead of <code>match_all<\/code>, I am using looking for people with specific title and limited the size as well.<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">{\n   \"took\" : 1,\n   \"timed_out\" : false,\n   \"_shards\" : {\n     \"total\" : 1,\n     \"successful\" : 1,\n     \"skipped\" : 0,\n     \"failed\" : 0\n   },\n   \"hits\" : {\n     \"total\" : {\n       \"value\" : 8,\n       \"relation\" : \"eq\"\n     },\n     \"max_score\" : null,\n     \"hits\" : [\n       {\n         \"_index\" : \"profile\",\n         \"_type\" : \"_doc\",\n         \"_id\" : \"6\",\n         \"_score\" : null,\n         \"_source\" : {\n           \"name\" : \"Smdie G\",\n           \"age\" : 24,\n           \"title\" : \"Mr.\",\n           \"role\" : \"Program management\",\n           \"org\" : \"Security\"\n         },\n         \"sort\" : [\n           24\n         ]\n       },\n       {\n         \"_index\" : \"profile\",\n         \"_type\" : \"_doc\",\n         \"_id\" : \"7\",\n         \"_score\" : null,\n         \"_source\" : {\n           \"name\" : \"Amdie G\",\n           \"age\" : 24,\n           \"title\" : \"Mr.\",\n           \"role\" : \"Program management\",\n           \"org\" : \"Security\"\n         },\n         \"sort\" : [\n           24\n         ]\n       },\n       {\n         \"_index\" : \"profile\",\n         \"_type\" : \"_doc\",\n         \"_id\" : \"3\",\n         \"_score\" : null,\n         \"_source\" : {\n           \"name\" : \"Deepak R\",\n           \"age\" : 25,\n           \"title\" : \"Mr.\",\n           \"role\" : \"Lead\",\n           \"org\" : \"Security\"\n         },\n         \"sort\" : [\n           25\n         ]\n       }\n     ]\n   }\n }<\/pre>\n\n\n\n<p>The element returned in the response have specific purpose like<\/p>\n\n\n\n<ul class=\"wp-block-list\"><li><code>took<\/code> &#8211; defines the time in milliseconds it took for the query to execute.<\/li><li><code>_shards<\/code> &#8211; specifies how many shards were searched, and its respective breakdown.<\/li><li><code>hits.total.value<\/code> &#8211; specifies the total matching documents found. (In example above it is 8)<\/li><\/ul>\n<\/div><\/div>\n\n\n\n<h2 class=\"has-vivid-red-color has-text-color wp-block-heading\">Q -3 What is Mapping?<\/h2>\n\n\n\n<p>Mapping defines how a document, and the fields it contains, are stored and indexed.<\/p>\n\n\n\n<ul class=\"wp-block-list\"><li>Which fields are date fields<\/li><li>Which string fields are to be used for full text searching<\/li><li>Which are numeric<\/li><\/ul>\n\n\n\n<h3 class=\"has-text-align-right wp-block-heading\">.. to be continued.<\/h3>\n\n\n\n<p><\/p>\n","protected":false},"excerpt":{"rendered":"<p>What I have been doing is evaluating Elasticsearch. The indexing, searching (Phrase, Similarity, Structured, Full Text, Complex), clustering etc. In this blog I will just try and simplify the learning curve. Q &#8211; 1 What is Elasticsearch? Distributed document store for complex datastore serialised as JSON Accessible from any of the member nodes. Uses Inverted [&hellip;]<\/p>\n","protected":false},"author":2,"featured_media":428,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_exactmetrics_skip_tracking":false,"_exactmetrics_sitenote_active":false,"_exactmetrics_sitenote_note":"","_exactmetrics_sitenote_category":0,"footnotes":""},"categories":[34],"tags":[53,54],"class_list":["post-427","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-technical","tag-elasticsearch","tag-v7-6"],"_links":{"self":[{"href":"https:\/\/blog.samarthya.me\/wps\/wp-json\/wp\/v2\/posts\/427","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/blog.samarthya.me\/wps\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/blog.samarthya.me\/wps\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/blog.samarthya.me\/wps\/wp-json\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"https:\/\/blog.samarthya.me\/wps\/wp-json\/wp\/v2\/comments?post=427"}],"version-history":[{"count":0,"href":"https:\/\/blog.samarthya.me\/wps\/wp-json\/wp\/v2\/posts\/427\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/blog.samarthya.me\/wps\/wp-json\/wp\/v2\/media\/428"}],"wp:attachment":[{"href":"https:\/\/blog.samarthya.me\/wps\/wp-json\/wp\/v2\/media?parent=427"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/blog.samarthya.me\/wps\/wp-json\/wp\/v2\/categories?post=427"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/blog.samarthya.me\/wps\/wp-json\/wp\/v2\/tags?post=427"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}