ಸ್ಥಿತಿಸ್ಥಾಪಕ ಹುಡುಕಾಟ ಬೇಸಿಕ್ಸ್

Elasticsearch ಎನ್ನುವುದು json rest api ಜೊತೆಗೆ ಲುಸೀನ್ ಅನ್ನು ಬಳಸಿಕೊಂಡು ಮತ್ತು ಜಾವಾದಲ್ಲಿ ಬರೆಯಲಾದ ಹುಡುಕಾಟ ಎಂಜಿನ್ ಆಗಿದೆ. ಈ ಎಂಜಿನ್‌ನ ಎಲ್ಲಾ ಅನುಕೂಲಗಳ ವಿವರಣೆ ಇಲ್ಲಿ ಲಭ್ಯವಿದೆ ಅಧಿಕೃತ ವೆಬ್ಸೈಟ್. ಕೆಳಗಿನವುಗಳಲ್ಲಿ ನಾವು ಸ್ಥಿತಿಸ್ಥಾಪಕ ಹುಡುಕಾಟವನ್ನು ES ಎಂದು ಉಲ್ಲೇಖಿಸುತ್ತೇವೆ.

ಡಾಕ್ಯುಮೆಂಟ್ ಡೇಟಾಬೇಸ್‌ನಲ್ಲಿ ಸಂಕೀರ್ಣ ಹುಡುಕಾಟಗಳಿಗಾಗಿ ಇದೇ ರೀತಿಯ ಎಂಜಿನ್‌ಗಳನ್ನು ಬಳಸಲಾಗುತ್ತದೆ. ಉದಾಹರಣೆಗೆ, ಭಾಷೆಯ ರೂಪವಿಜ್ಞಾನವನ್ನು ಗಣನೆಗೆ ತೆಗೆದುಕೊಂಡು ಹುಡುಕಿ ಅಥವಾ ಜಿಯೋ ನಿರ್ದೇಶಾಂಕಗಳ ಮೂಲಕ ಹುಡುಕಿ.

ಈ ಲೇಖನದಲ್ಲಿ ನಾನು ಬ್ಲಾಗ್ ಪೋಸ್ಟ್‌ಗಳನ್ನು ಸೂಚಿಕೆ ಮಾಡುವ ಉದಾಹರಣೆಯನ್ನು ಬಳಸಿಕೊಂಡು ES ನ ಮೂಲಭೂತ ಅಂಶಗಳನ್ನು ಕುರಿತು ಮಾತನಾಡುತ್ತೇನೆ. ಡಾಕ್ಯುಮೆಂಟ್‌ಗಳನ್ನು ಹೇಗೆ ಫಿಲ್ಟರ್ ಮಾಡುವುದು, ವಿಂಗಡಿಸುವುದು ಮತ್ತು ಹುಡುಕುವುದು ಎಂಬುದನ್ನು ನಾನು ನಿಮಗೆ ತೋರಿಸುತ್ತೇನೆ.

ಆಪರೇಟಿಂಗ್ ಸಿಸ್ಟಮ್ ಅನ್ನು ಅವಲಂಬಿಸದಿರಲು, ನಾನು CURL ಅನ್ನು ಬಳಸಿಕೊಂಡು ES ಗೆ ಎಲ್ಲಾ ವಿನಂತಿಗಳನ್ನು ಮಾಡುತ್ತೇನೆ. ಗೂಗಲ್ ಕ್ರೋಮ್ ಎಂಬ ಪ್ಲಗಿನ್ ಕೂಡ ಇದೆ ಅರ್ಥ.

ಪಠ್ಯವು ದಸ್ತಾವೇಜನ್ನು ಮತ್ತು ಇತರ ಮೂಲಗಳಿಗೆ ಲಿಂಕ್‌ಗಳನ್ನು ಒಳಗೊಂಡಿದೆ. ಕೊನೆಯಲ್ಲಿ ದಸ್ತಾವೇಜನ್ನು ತ್ವರಿತ ಪ್ರವೇಶಕ್ಕಾಗಿ ಲಿಂಕ್‌ಗಳಿವೆ. ಪರಿಚಯವಿಲ್ಲದ ಪದಗಳ ವ್ಯಾಖ್ಯಾನಗಳನ್ನು ಕಾಣಬಹುದು ಪದಕೋಶಗಳು.

ES ಅನ್ನು ಸ್ಥಾಪಿಸಲಾಗುತ್ತಿದೆ

ಇದನ್ನು ಮಾಡಲು, ನಮಗೆ ಮೊದಲು ಜಾವಾ ಅಗತ್ಯವಿದೆ. ಡೆವಲಪರ್‌ಗಳು ಶಿಫಾರಸು ಮಾಡಿ ಜಾವಾ 8 ಅಪ್ಡೇಟ್ 20 ಅಥವಾ ಜಾವಾ 7 ಅಪ್ಡೇಟ್ 55 ಗಿಂತ ಹೊಸ ಜಾವಾ ಆವೃತ್ತಿಗಳನ್ನು ಸ್ಥಾಪಿಸಿ.

ES ವಿತರಣೆಯು ಇಲ್ಲಿ ಲಭ್ಯವಿದೆ ಡೆವಲಪರ್ ವೆಬ್‌ಸೈಟ್. ಆರ್ಕೈವ್ ಅನ್ನು ಅನ್ಪ್ಯಾಕ್ ಮಾಡಿದ ನಂತರ ನೀವು ರನ್ ಮಾಡಬೇಕಾಗುತ್ತದೆ bin/elasticsearch. ಸಹ ಲಭ್ಯವಿದೆ apt ಮತ್ತು yum ಗಾಗಿ ಪ್ಯಾಕೇಜುಗಳು. ಇದೆ ಡಾಕರ್‌ಗಾಗಿ ಅಧಿಕೃತ ಚಿತ್ರ. ಅನುಸ್ಥಾಪನೆಯ ಬಗ್ಗೆ ಇನ್ನಷ್ಟು.

ಅನುಸ್ಥಾಪನೆ ಮತ್ತು ಪ್ರಾರಂಭದ ನಂತರ, ಕಾರ್ಯವನ್ನು ಪರಿಶೀಲಿಸೋಣ:

# для удобства запомним адрес в переменную
#export ES_URL=$(docker-machine ip dev):9200
export ES_URL=localhost:9200

curl -X GET $ES_URL

ನಾವು ಈ ರೀತಿಯದನ್ನು ಸ್ವೀಕರಿಸುತ್ತೇವೆ:

{
  "name" : "Heimdall",
  "cluster_name" : "elasticsearch",
  "version" : {
    "number" : "2.2.1",
    "build_hash" : "d045fc29d1932bce18b2e65ab8b297fbf6cd41a1",
    "build_timestamp" : "2016-03-09T09:38:54Z",
    "build_snapshot" : false,
    "lucene_version" : "5.4.1"
  },
  "tagline" : "You Know, for Search"
}

ಸೂಚ್ಯಂಕ

ES ಗೆ ಪೋಸ್ಟ್ ಅನ್ನು ಸೇರಿಸೋಣ:

# Добавим документ c id 1 типа post в индекс blog.
# ?pretty указывает, что вывод должен быть человеко-читаемым.

curl -XPUT "$ES_URL/blog/post/1?pretty" -d'
{
  "title": "Веселые котята",
  "content": "<p>Смешная история про котят<p>",
  "tags": [
    "котята",
    "смешная история"
  ],
  "published_at": "2014-09-12T20:44:42+00:00"
}'

ಸರ್ವರ್ ಪ್ರತಿಕ್ರಿಯೆ:

{
  "_index" : "blog",
  "_type" : "post",
  "_id" : "1",
  "_version" : 1,
  "_shards" : {
    "total" : 2,
    "successful" : 1,
    "failed" : 0
  },
  "created" : false
}

ES ಸ್ವಯಂಚಾಲಿತವಾಗಿ ರಚಿಸಲಾಗಿದೆ ಸೂಚ್ಯಂಕ ಬ್ಲಾಗ್ ಮತ್ತು ಟಿಪ್ಪಿ ಪೋಸ್ಟ್. ನಾವು ಷರತ್ತುಬದ್ಧ ಸಾದೃಶ್ಯವನ್ನು ಸೆಳೆಯಬಹುದು: ಸೂಚ್ಯಂಕವು ಡೇಟಾಬೇಸ್, ಮತ್ತು ಪ್ರಕಾರವು ಈ ಡೇಟಾಬೇಸ್‌ನಲ್ಲಿ ಟೇಬಲ್ ಆಗಿದೆ. ಪ್ರತಿಯೊಂದು ವಿಧವು ತನ್ನದೇ ಆದ ಯೋಜನೆಯನ್ನು ಹೊಂದಿದೆ - ಮ್ಯಾಪಿಂಗ್, ಸಂಬಂಧಿತ ಕೋಷ್ಟಕದಂತೆಯೇ. ಡಾಕ್ಯುಮೆಂಟ್ ಅನ್ನು ಇಂಡೆಕ್ಸ್ ಮಾಡಿದಾಗ ಮ್ಯಾಪಿಂಗ್ ಸ್ವಯಂಚಾಲಿತವಾಗಿ ಉತ್ಪತ್ತಿಯಾಗುತ್ತದೆ:

# Получим mapping всех типов индекса blog
curl -XGET "$ES_URL/blog/_mapping?pretty"

ಸರ್ವರ್ ಪ್ರತಿಕ್ರಿಯೆಯಲ್ಲಿ, ನಾನು ಕಾಮೆಂಟ್‌ಗಳಲ್ಲಿ ಸೂಚ್ಯಂಕದ ಡಾಕ್ಯುಮೆಂಟ್‌ನ ಕ್ಷೇತ್ರಗಳ ಮೌಲ್ಯಗಳನ್ನು ಸೇರಿಸಿದ್ದೇನೆ:

{
  "blog" : {
    "mappings" : {
      "post" : {
        "properties" : {
          /* "content": "<p>Смешная история про котят<p>", */ 
          "content" : {
            "type" : "string"
          },
          /* "published_at": "2014-09-12T20:44:42+00:00" */
          "published_at" : {
            "type" : "date",
            "format" : "strict_date_optional_time||epoch_millis"
          },
          /* "tags": ["котята", "смешная история"] */
          "tags" : {
            "type" : "string"
          },
          /*  "title": "Веселые котята" */
          "title" : {
            "type" : "string"
          }
        }
      }
    }
  }
}

ES ಒಂದೇ ಮೌಲ್ಯ ಮತ್ತು ಮೌಲ್ಯಗಳ ಶ್ರೇಣಿಯ ನಡುವೆ ವ್ಯತ್ಯಾಸವನ್ನು ಹೊಂದಿಲ್ಲ ಎಂಬುದು ಗಮನಿಸಬೇಕಾದ ಸಂಗತಿ. ಉದಾಹರಣೆಗೆ, ಶೀರ್ಷಿಕೆ ಕ್ಷೇತ್ರವು ಸರಳವಾಗಿ ಶೀರ್ಷಿಕೆಯನ್ನು ಹೊಂದಿರುತ್ತದೆ, ಮತ್ತು ಟ್ಯಾಗ್‌ಗಳ ಕ್ಷೇತ್ರವು ಸ್ಟ್ರಿಂಗ್‌ಗಳ ಒಂದು ಶ್ರೇಣಿಯನ್ನು ಹೊಂದಿರುತ್ತದೆ, ಆದರೂ ಅವುಗಳನ್ನು ಮ್ಯಾಪಿಂಗ್‌ನಲ್ಲಿ ಅದೇ ರೀತಿಯಲ್ಲಿ ಪ್ರತಿನಿಧಿಸಲಾಗುತ್ತದೆ.
ನಾವು ನಂತರ ಮ್ಯಾಪಿಂಗ್ ಬಗ್ಗೆ ಹೆಚ್ಚು ಮಾತನಾಡುತ್ತೇವೆ.

ವಿನಂತಿಗಳನ್ನು

ಅದರ ಐಡಿ ಮೂಲಕ ಡಾಕ್ಯುಮೆಂಟ್ ಅನ್ನು ಹಿಂಪಡೆಯುವುದು:

# извлечем документ с id 1 типа post из индекса blog
curl -XGET "$ES_URL/blog/post/1?pretty"
{
  "_index" : "blog",
  "_type" : "post",
  "_id" : "1",
  "_version" : 1,
  "found" : true,
  "_source" : {
    "title" : "Веселые котята",
    "content" : "<p>Смешная история про котят<p>",
    "tags" : [ "котята", "смешная история" ],
    "published_at" : "2014-09-12T20:44:42+00:00"
  }
}

ಪ್ರತಿಕ್ರಿಯೆಯಲ್ಲಿ ಹೊಸ ಕೀಗಳು ಕಾಣಿಸಿಕೊಂಡವು: _version и _source. ಸಾಮಾನ್ಯವಾಗಿ, ಎಲ್ಲಾ ಕೀಗಳು ಪ್ರಾರಂಭವಾಗುತ್ತವೆ _ ಅಧಿಕೃತ ಎಂದು ವರ್ಗೀಕರಿಸಲಾಗಿದೆ.

ಕೀ _version ಡಾಕ್ಯುಮೆಂಟ್ ಆವೃತ್ತಿಯನ್ನು ತೋರಿಸುತ್ತದೆ. ಆಶಾವಾದಿ ಲಾಕಿಂಗ್ ಕಾರ್ಯವಿಧಾನವು ಕಾರ್ಯನಿರ್ವಹಿಸಲು ಇದು ಅಗತ್ಯವಿದೆ. ಉದಾಹರಣೆಗೆ, ನಾವು ಆವೃತ್ತಿ 1 ಅನ್ನು ಹೊಂದಿರುವ ಡಾಕ್ಯುಮೆಂಟ್ ಅನ್ನು ಬದಲಾಯಿಸಲು ಬಯಸುತ್ತೇವೆ. ನಾವು ಬದಲಾದ ಡಾಕ್ಯುಮೆಂಟ್ ಅನ್ನು ಸಲ್ಲಿಸುತ್ತೇವೆ ಮತ್ತು ಇದು ಆವೃತ್ತಿ 1 ರೊಂದಿಗಿನ ಡಾಕ್ಯುಮೆಂಟ್‌ನ ಸಂಪಾದನೆಯಾಗಿದೆ ಎಂದು ಸೂಚಿಸುತ್ತೇವೆ. ಬೇರೆ ಯಾರಾದರೂ ಸಹ ಆವೃತ್ತಿ 1 ನೊಂದಿಗೆ ಡಾಕ್ಯುಮೆಂಟ್ ಅನ್ನು ಸಂಪಾದಿಸಿದರೆ ಮತ್ತು ನಮ್ಮ ಮುಂದೆ ಬದಲಾವಣೆಗಳನ್ನು ಸಲ್ಲಿಸಿದರೆ, ನಂತರ ES ನಮ್ಮ ಬದಲಾವಣೆಗಳನ್ನು ಸ್ವೀಕರಿಸುವುದಿಲ್ಲ, ಏಕೆಂದರೆ ಇದು ಆವೃತ್ತಿ 2 ನೊಂದಿಗೆ ಡಾಕ್ಯುಮೆಂಟ್ ಅನ್ನು ಸಂಗ್ರಹಿಸುತ್ತದೆ.

ಕೀ _source ನಾವು ಸೂಚಿಸಿದ ಡಾಕ್ಯುಮೆಂಟ್ ಅನ್ನು ಒಳಗೊಂಡಿದೆ. ಹುಡುಕಾಟ ಕಾರ್ಯಾಚರಣೆಗಳಿಗಾಗಿ ES ಈ ಮೌಲ್ಯವನ್ನು ಬಳಸುವುದಿಲ್ಲ ಏಕೆಂದರೆ ಹುಡುಕಾಟಕ್ಕಾಗಿ ಸೂಚ್ಯಂಕಗಳನ್ನು ಬಳಸಲಾಗುತ್ತದೆ. ಜಾಗವನ್ನು ಉಳಿಸಲು, ES ಸಂಕುಚಿತ ಮೂಲ ಡಾಕ್ಯುಮೆಂಟ್ ಅನ್ನು ಸಂಗ್ರಹಿಸುತ್ತದೆ. ನಮಗೆ ಐಡಿ ಮಾತ್ರ ಅಗತ್ಯವಿದ್ದರೆ ಮತ್ತು ಸಂಪೂರ್ಣ ಮೂಲ ಡಾಕ್ಯುಮೆಂಟ್ ಅಲ್ಲ, ನಂತರ ನಾವು ಮೂಲ ಸಂಗ್ರಹಣೆಯನ್ನು ನಿಷ್ಕ್ರಿಯಗೊಳಿಸಬಹುದು.

ನಮಗೆ ಹೆಚ್ಚುವರಿ ಮಾಹಿತಿ ಅಗತ್ಯವಿಲ್ಲದಿದ್ದರೆ, ನಾವು _source ನ ವಿಷಯಗಳನ್ನು ಮಾತ್ರ ಪಡೆಯಬಹುದು:

curl -XGET "$ES_URL/blog/post/1/_source?pretty"
{
  "title" : "Веселые котята",
  "content" : "<p>Смешная история про котят<p>",
  "tags" : [ "котята", "смешная история" ],
  "published_at" : "2014-09-12T20:44:42+00:00"
}

ನೀವು ಕೆಲವು ಕ್ಷೇತ್ರಗಳನ್ನು ಮಾತ್ರ ಆಯ್ಕೆ ಮಾಡಬಹುದು:

# извлечем только поле title
curl -XGET "$ES_URL/blog/post/1?_source=title&pretty"
{
  "_index" : "blog",
  "_type" : "post",
  "_id" : "1",
  "_version" : 1,
  "found" : true,
  "_source" : {
    "title" : "Веселые котята"
  }
}

ಇನ್ನೂ ಕೆಲವು ಪೋಸ್ಟ್‌ಗಳನ್ನು ಇಂಡೆಕ್ಸ್ ಮಾಡೋಣ ಮತ್ತು ಹೆಚ್ಚು ಸಂಕೀರ್ಣವಾದ ಪ್ರಶ್ನೆಗಳನ್ನು ರನ್ ಮಾಡೋಣ.

curl -XPUT "$ES_URL/blog/post/2" -d'
{
  "title": "Веселые щенки",
  "content": "<p>Смешная история про щенков<p>",
  "tags": [
    "щенки",
    "смешная история"
  ],
  "published_at": "2014-08-12T20:44:42+00:00"
}'
curl -XPUT "$ES_URL/blog/post/3" -d'
{
  "title": "Как у меня появился котенок",
  "content": "<p>Душераздирающая история про бедного котенка с улицы<p>",
  "tags": [
    "котята"
  ],
  "published_at": "2014-07-21T20:44:42+00:00"
}'

ವಿಂಗಡಿಸಲಾಗುತ್ತಿದೆ

# найдем последний пост по дате публикации и извлечем поля title и published_at
curl -XGET "$ES_URL/blog/post/_search?pretty" -d'
{
  "size": 1,
  "_source": ["title", "published_at"],
  "sort": [{"published_at": "desc"}]
}'
{
  "took" : 8,
  "timed_out" : false,
  "_shards" : {
    "total" : 5,
    "successful" : 5,
    "failed" : 0
  },
  "hits" : {
    "total" : 3,
    "max_score" : null,
    "hits" : [ {
      "_index" : "blog",
      "_type" : "post",
      "_id" : "1",
      "_score" : null,
      "_source" : {
        "title" : "Веселые котята",
        "published_at" : "2014-09-12T20:44:42+00:00"
      },
      "sort" : [ 1410554682000 ]
    } ]
  }
}

ನಾವು ಕೊನೆಯ ಪೋಸ್ಟ್ ಅನ್ನು ಆರಿಸಿದ್ದೇವೆ. size ನೀಡಬೇಕಾದ ದಾಖಲೆಗಳ ಸಂಖ್ಯೆಯನ್ನು ಮಿತಿಗೊಳಿಸುತ್ತದೆ. total ವಿನಂತಿಗೆ ಹೊಂದಿಕೆಯಾಗುವ ಒಟ್ಟು ದಾಖಲೆಗಳ ಸಂಖ್ಯೆಯನ್ನು ತೋರಿಸುತ್ತದೆ. sort ಔಟ್‌ಪುಟ್‌ನಲ್ಲಿ ವಿಂಗಡಣೆಯನ್ನು ನಿರ್ವಹಿಸುವ ಪೂರ್ಣಾಂಕಗಳ ಒಂದು ಶ್ರೇಣಿಯನ್ನು ಹೊಂದಿರುತ್ತದೆ. ಆ. ದಿನಾಂಕವನ್ನು ಪೂರ್ಣಾಂಕಕ್ಕೆ ಪರಿವರ್ತಿಸಲಾಗಿದೆ. ವಿಂಗಡಣೆಯ ಕುರಿತು ಹೆಚ್ಚಿನ ಮಾಹಿತಿಯನ್ನು ಇಲ್ಲಿ ಕಾಣಬಹುದು ದಸ್ತಾವೇಜನ್ನು.

ಶೋಧಕಗಳು ಮತ್ತು ಪ್ರಶ್ನೆಗಳು

ಆವೃತ್ತಿ 2 ರಿಂದ ES ಫಿಲ್ಟರ್‌ಗಳು ಮತ್ತು ಪ್ರಶ್ನೆಗಳ ನಡುವೆ ವ್ಯತ್ಯಾಸವನ್ನು ತೋರಿಸುವುದಿಲ್ಲ, ಬದಲಿಗೆ ಸಂದರ್ಭಗಳ ಪರಿಕಲ್ಪನೆಯನ್ನು ಪರಿಚಯಿಸಲಾಗಿದೆ.
ಪ್ರಶ್ನೆಯ ಸಂದರ್ಭವು ಫಿಲ್ಟರ್ ಸಂದರ್ಭದಿಂದ ಭಿನ್ನವಾಗಿರುತ್ತದೆ, ಇದರಲ್ಲಿ ಪ್ರಶ್ನೆಯು _ಸ್ಕೋರ್ ಅನ್ನು ಉತ್ಪಾದಿಸುತ್ತದೆ ಮತ್ತು ಸಂಗ್ರಹವಾಗುವುದಿಲ್ಲ. _ಸ್ಕೋರ್ ಏನೆಂದು ನಾನು ನಿಮಗೆ ನಂತರ ತೋರಿಸುತ್ತೇನೆ.

ದಿನಾಂಕದ ಪ್ರಕಾರ ಫಿಲ್ಟರ್ ಮಾಡಿ

ನಾವು ವಿನಂತಿಯನ್ನು ಬಳಸುತ್ತೇವೆ ಶ್ರೇಣಿಯ ಫಿಲ್ಟರ್ ಸಂದರ್ಭದಲ್ಲಿ:

# получим посты, опубликованные 1ого сентября или позже
curl -XGET "$ES_URL/blog/post/_search?pretty" -d'
{
  "filter": {
    "range": {
      "published_at": { "gte": "2014-09-01" }
    }
  }
}'

ಟ್ಯಾಗ್‌ಗಳ ಮೂಲಕ ಫಿಲ್ಟರ್ ಮಾಡಿ

ನಾವು ಉಪಯೋಗಿಸುತ್ತೀವಿ ಪದದ ಪ್ರಶ್ನೆ ಕೊಟ್ಟಿರುವ ಪದವನ್ನು ಹೊಂದಿರುವ ಡಾಕ್ಯುಮೆಂಟ್ ಐಡಿಗಳನ್ನು ಹುಡುಕಲು:

# найдем все документы, в поле tags которых есть элемент 'котята'
curl -XGET "$ES_URL/blog/post/_search?pretty" -d'
{
  "_source": [
    "title",
    "tags"
  ],
  "filter": {
    "term": {
      "tags": "котята"
    }
  }
}'
{
  "took" : 9,
  "timed_out" : false,
  "_shards" : {
    "total" : 5,
    "successful" : 5,
    "failed" : 0
  },
  "hits" : {
    "total" : 2,
    "max_score" : 1.0,
    "hits" : [ {
      "_index" : "blog",
      "_type" : "post",
      "_id" : "1",
      "_score" : 1.0,
      "_source" : {
        "title" : "Веселые котята",
        "tags" : [ "котята", "смешная история" ]
      }
    }, {
      "_index" : "blog",
      "_type" : "post",
      "_id" : "3",
      "_score" : 1.0,
      "_source" : {
        "title" : "Как у меня появился котенок",
        "tags" : [ "котята" ]
      }
    } ]
  }
}

ಪೂರ್ಣ ಪಠ್ಯ ಹುಡುಕಾಟ

ನಮ್ಮ ಮೂರು ಡಾಕ್ಯುಮೆಂಟ್‌ಗಳು ವಿಷಯ ಕ್ಷೇತ್ರದಲ್ಲಿ ಈ ಕೆಳಗಿನವುಗಳನ್ನು ಒಳಗೊಂಡಿವೆ:

  • <p>Смешная история про котят<p>
  • <p>Смешная история про щенков<p>
  • <p>Душераздирающая история про бедного котенка с улицы<p>

ನಾವು ಉಪಯೋಗಿಸುತ್ತೀವಿ ಪ್ರಶ್ನೆಯನ್ನು ಹೊಂದಿಸಿ ಕೊಟ್ಟಿರುವ ಪದವನ್ನು ಹೊಂದಿರುವ ಡಾಕ್ಯುಮೆಂಟ್ ಐಡಿಗಳನ್ನು ಹುಡುಕಲು:

# source: false означает, что не нужно извлекать _source найденных документов
curl -XGET "$ES_URL/blog/post/_search?pretty" -d'
{
  "_source": false,
  "query": {
    "match": {
      "content": "история"
    }
  }
}'
{
  "took" : 13,
  "timed_out" : false,
  "_shards" : {
    "total" : 5,
    "successful" : 5,
    "failed" : 0
  },
  "hits" : {
    "total" : 3,
    "max_score" : 0.11506981,
    "hits" : [ {
      "_index" : "blog",
      "_type" : "post",
      "_id" : "2",
      "_score" : 0.11506981
    }, {
      "_index" : "blog",
      "_type" : "post",
      "_id" : "1",
      "_score" : 0.11506981
    }, {
      "_index" : "blog",
      "_type" : "post",
      "_id" : "3",
      "_score" : 0.095891505
    } ]
  }
}

ಆದಾಗ್ಯೂ, ನಾವು ವಿಷಯ ಕ್ಷೇತ್ರದಲ್ಲಿ "ಕಥೆಗಳು" ಎಂದು ಹುಡುಕಿದರೆ, ನಾವು ಏನನ್ನೂ ಕಾಣುವುದಿಲ್ಲ, ಏಕೆಂದರೆ ಸೂಚ್ಯಂಕವು ಮೂಲ ಪದಗಳನ್ನು ಮಾತ್ರ ಒಳಗೊಂಡಿದೆ, ಅವುಗಳ ಕಾಂಡಗಳಲ್ಲ. ಉತ್ತಮ ಗುಣಮಟ್ಟದ ಹುಡುಕಾಟವನ್ನು ಮಾಡಲು, ನೀವು ವಿಶ್ಲೇಷಕವನ್ನು ಕಾನ್ಫಿಗರ್ ಮಾಡಬೇಕಾಗುತ್ತದೆ.

ಕ್ಷೇತ್ರ _score ಪ್ರದರ್ಶನಗಳು ಪ್ರಸ್ತುತತೆ. ವಿನಂತಿಯನ್ನು ಫಿಲ್ಟರ್ ಸನ್ನಿವೇಶದಲ್ಲಿ ಕಾರ್ಯಗತಗೊಳಿಸಿದರೆ, ನಂತರ _ಸ್ಕೋರ್ ಮೌಲ್ಯವು ಯಾವಾಗಲೂ 1 ಕ್ಕೆ ಸಮನಾಗಿರುತ್ತದೆ, ಅಂದರೆ ಫಿಲ್ಟರ್‌ಗೆ ಸಂಪೂರ್ಣ ಹೊಂದಾಣಿಕೆ.

ವಿಶ್ಲೇಷಕರು

ವಿಶ್ಲೇಷಕರು ಮೂಲ ಪಠ್ಯವನ್ನು ಟೋಕನ್‌ಗಳ ಗುಂಪಾಗಿ ಪರಿವರ್ತಿಸಲು ಅಗತ್ಯವಿದೆ.
ವಿಶ್ಲೇಷಕರು ಒಂದನ್ನು ಒಳಗೊಂಡಿರುತ್ತದೆ ಟೋಕನೈಸರ್ ಮತ್ತು ಹಲವಾರು ಐಚ್ಛಿಕ ಟೋಕನ್ ಫಿಲ್ಟರ್‌ಗಳು. ಟೋಕನೈಸರ್ ಹಲವಾರು ಮೊದಲು ಇರಬಹುದು ಚಾರ್ಫಿಲ್ಟರ್ಗಳು. ಟೋಕನೈಸರ್‌ಗಳು ಮೂಲ ಸ್ಟ್ರಿಂಗ್ ಅನ್ನು ಟೋಕನ್‌ಗಳಾಗಿ ಒಡೆಯುತ್ತವೆ, ಉದಾಹರಣೆಗೆ ಸ್ಪೇಸ್‌ಗಳು ಮತ್ತು ವಿರಾಮಚಿಹ್ನೆಯ ಅಕ್ಷರಗಳು. ಟೋಕನ್‌ಫಿಲ್ಟರ್ ಟೋಕನ್‌ಗಳನ್ನು ಬದಲಾಯಿಸಬಹುದು, ಹೊಸದನ್ನು ಅಳಿಸಬಹುದು ಅಥವಾ ಸೇರಿಸಬಹುದು, ಉದಾಹರಣೆಗೆ, ಪದದ ಕಾಂಡವನ್ನು ಮಾತ್ರ ಬಿಡಿ, ಪೂರ್ವಭಾವಿಗಳನ್ನು ತೆಗೆದುಹಾಕಿ, ಸಮಾನಾರ್ಥಕಗಳನ್ನು ಸೇರಿಸಿ. CharFilter - ಸಂಪೂರ್ಣ ಮೂಲ ಸ್ಟ್ರಿಂಗ್ ಅನ್ನು ಬದಲಾಯಿಸುತ್ತದೆ, ಉದಾಹರಣೆಗೆ, html ಟ್ಯಾಗ್‌ಗಳನ್ನು ಕತ್ತರಿಸುತ್ತದೆ.

ES ಹಲವಾರು ಹೊಂದಿದೆ ಪ್ರಮಾಣಿತ ವಿಶ್ಲೇಷಕರು. ಉದಾಹರಣೆಗೆ, ವಿಶ್ಲೇಷಕ ರಷ್ಯಾದ.

ಪ್ರಯೋಜನ ಪಡೆಯೋಣ API ಮತ್ತು ಪ್ರಮಾಣಿತ ಮತ್ತು ರಷ್ಯನ್ ವಿಶ್ಲೇಷಕರು "ಕಿಟೆನ್ಸ್ ಬಗ್ಗೆ ತಮಾಷೆಯ ಕಥೆಗಳು" ಸ್ಟ್ರಿಂಗ್ ಅನ್ನು ಹೇಗೆ ಪರಿವರ್ತಿಸುತ್ತಾರೆ ಎಂಬುದನ್ನು ನೋಡೋಣ:

# используем анализатор standard       
# обязательно нужно перекодировать не ASCII символы
curl -XGET "$ES_URL/_analyze?pretty&analyzer=standard&text=%D0%92%D0%B5%D1%81%D0%B5%D0%BB%D1%8B%D0%B5%20%D0%B8%D1%81%D1%82%D0%BE%D1%80%D0%B8%D0%B8%20%D0%BF%D1%80%D0%BE%20%D0%BA%D0%BE%D1%82%D1%8F%D1%82"
{
  "tokens" : [ {
    "token" : "веселые",
    "start_offset" : 0,
    "end_offset" : 7,
    "type" : "<ALPHANUM>",
    "position" : 0
  }, {
    "token" : "истории",
    "start_offset" : 8,
    "end_offset" : 15,
    "type" : "<ALPHANUM>",
    "position" : 1
  }, {
    "token" : "про",
    "start_offset" : 16,
    "end_offset" : 19,
    "type" : "<ALPHANUM>",
    "position" : 2
  }, {
    "token" : "котят",
    "start_offset" : 20,
    "end_offset" : 25,
    "type" : "<ALPHANUM>",
    "position" : 3
  } ]
}
# используем анализатор russian
curl -XGET "$ES_URL/_analyze?pretty&analyzer=russian&text=%D0%92%D0%B5%D1%81%D0%B5%D0%BB%D1%8B%D0%B5%20%D0%B8%D1%81%D1%82%D0%BE%D1%80%D0%B8%D0%B8%20%D0%BF%D1%80%D0%BE%20%D0%BA%D0%BE%D1%82%D1%8F%D1%82"
{
  "tokens" : [ {
    "token" : "весел",
    "start_offset" : 0,
    "end_offset" : 7,
    "type" : "<ALPHANUM>",
    "position" : 0
  }, {
    "token" : "истор",
    "start_offset" : 8,
    "end_offset" : 15,
    "type" : "<ALPHANUM>",
    "position" : 1
  }, {
    "token" : "кот",
    "start_offset" : 20,
    "end_offset" : 25,
    "type" : "<ALPHANUM>",
    "position" : 3
  } ]
}

ಸ್ಟ್ಯಾಂಡರ್ಡ್ ವಿಶ್ಲೇಷಕವು ಸ್ಟ್ರಿಂಗ್ ಅನ್ನು ಸ್ಪೇಸ್‌ಗಳಿಂದ ವಿಭಜಿಸಿತು ಮತ್ತು ಎಲ್ಲವನ್ನೂ ಲೋವರ್ ಕೇಸ್‌ಗೆ ಪರಿವರ್ತಿಸಿತು, ರಷ್ಯನ್ ವಿಶ್ಲೇಷಕವು ಮುಖ್ಯವಲ್ಲದ ಪದಗಳನ್ನು ತೆಗೆದುಹಾಕಿತು, ಅದನ್ನು ಲೋವರ್ ಕೇಸ್‌ಗೆ ಪರಿವರ್ತಿಸಿತು ಮತ್ತು ಪದಗಳ ಕಾಂಡವನ್ನು ಬಿಟ್ಟಿತು.

ರಷ್ಯಾದ ವಿಶ್ಲೇಷಕವು ಯಾವ ಟೋಕನೈಜರ್, ಟೋಕನ್ ಫಿಲ್ಟರ್‌ಗಳು, ಚಾರ್ಫಿಲ್ಟರ್‌ಗಳನ್ನು ಬಳಸುತ್ತದೆ ಎಂಬುದನ್ನು ನೋಡೋಣ:

{
  "filter": {
    "russian_stop": {
      "type":       "stop",
      "stopwords":  "_russian_"
    },
    "russian_keywords": {
      "type":       "keyword_marker",
      "keywords":   []
    },
    "russian_stemmer": {
      "type":       "stemmer",
      "language":   "russian"
    }
  },
  "analyzer": {
    "russian": {
      "tokenizer":  "standard",
      /* TokenFilters */
      "filter": [
        "lowercase",
        "russian_stop",
        "russian_keywords",
        "russian_stemmer"
      ]
      /* CharFilters отсутствуют */
    }
  }
}

ರಷ್ಯಾದ ಆಧಾರದ ಮೇಲೆ ನಮ್ಮ ವಿಶ್ಲೇಷಕವನ್ನು ವಿವರಿಸೋಣ, ಅದು html ಟ್ಯಾಗ್‌ಗಳನ್ನು ಕತ್ತರಿಸುತ್ತದೆ. ಡೀಫಾಲ್ಟ್ ಎಂದು ಕರೆಯೋಣ, ಏಕೆಂದರೆ ಈ ಹೆಸರಿನ ವಿಶ್ಲೇಷಕವನ್ನು ಪೂರ್ವನಿಯೋಜಿತವಾಗಿ ಬಳಸಲಾಗುತ್ತದೆ.

{
  "filter": {
    "ru_stop": {
      "type":       "stop",
      "stopwords":  "_russian_"
    },
    "ru_stemmer": {
      "type":       "stemmer",
      "language":   "russian"
    }
  },
  "analyzer": {
    "default": {
      /* добавляем удаление html тегов */
      "char_filter": ["html_strip"],
      "tokenizer":  "standard",
      "filter": [
        "lowercase",
        "ru_stop",
        "ru_stemmer"
      ]
    }
  }
}

ಮೊದಲಿಗೆ, ಎಲ್ಲಾ HTML ಟ್ಯಾಗ್‌ಗಳನ್ನು ಮೂಲ ಸ್ಟ್ರಿಂಗ್‌ನಿಂದ ತೆಗೆದುಹಾಕಲಾಗುತ್ತದೆ, ನಂತರ ಟೋಕನೈಜರ್ ಮಾನದಂಡವು ಅದನ್ನು ಟೋಕನ್‌ಗಳಾಗಿ ವಿಭಜಿಸುತ್ತದೆ, ಪರಿಣಾಮವಾಗಿ ಟೋಕನ್‌ಗಳು ಲೋವರ್ ಕೇಸ್‌ಗೆ ಚಲಿಸುತ್ತವೆ, ಅತ್ಯಲ್ಪ ಪದಗಳನ್ನು ತೆಗೆದುಹಾಕಲಾಗುತ್ತದೆ ಮತ್ತು ಉಳಿದ ಟೋಕನ್‌ಗಳು ಪದದ ಕಾಂಡವಾಗಿ ಉಳಿಯುತ್ತವೆ.

ಸೂಚ್ಯಂಕವನ್ನು ರಚಿಸುವುದು

ಮೇಲೆ ನಾವು ಡೀಫಾಲ್ಟ್ ವಿಶ್ಲೇಷಕವನ್ನು ವಿವರಿಸಿದ್ದೇವೆ. ಇದು ಎಲ್ಲಾ ಸ್ಟ್ರಿಂಗ್ ಕ್ಷೇತ್ರಗಳಿಗೆ ಅನ್ವಯಿಸುತ್ತದೆ. ನಮ್ಮ ಪೋಸ್ಟ್ ಟ್ಯಾಗ್‌ಗಳ ಒಂದು ಶ್ರೇಣಿಯನ್ನು ಹೊಂದಿದೆ, ಆದ್ದರಿಂದ ಟ್ಯಾಗ್‌ಗಳನ್ನು ವಿಶ್ಲೇಷಕದಿಂದ ಪ್ರಕ್ರಿಯೆಗೊಳಿಸಲಾಗುತ್ತದೆ. ಏಕೆಂದರೆ ಟ್ಯಾಗ್‌ಗೆ ನಿಖರವಾದ ಹೊಂದಾಣಿಕೆಯ ಮೂಲಕ ನಾವು ಪೋಸ್ಟ್‌ಗಳನ್ನು ಹುಡುಕುತ್ತಿದ್ದೇವೆ, ನಂತರ ನಾವು ಟ್ಯಾಗ್‌ಗಳ ಕ್ಷೇತ್ರಕ್ಕಾಗಿ ವಿಶ್ಲೇಷಣೆಯನ್ನು ನಿಷ್ಕ್ರಿಯಗೊಳಿಸಬೇಕಾಗಿದೆ.

ವಿಶ್ಲೇಷಕ ಮತ್ತು ಮ್ಯಾಪಿಂಗ್‌ನೊಂದಿಗೆ ಸೂಚ್ಯಂಕ ಬ್ಲಾಗ್2 ಅನ್ನು ರಚಿಸೋಣ, ಇದರಲ್ಲಿ ಟ್ಯಾಗ್‌ಗಳ ಕ್ಷೇತ್ರದ ವಿಶ್ಲೇಷಣೆಯನ್ನು ನಿಷ್ಕ್ರಿಯಗೊಳಿಸಲಾಗಿದೆ:

curl -XPOST "$ES_URL/blog2" -d'
{
  "settings": {
    "analysis": {
      "filter": {
        "ru_stop": {
          "type": "stop",
          "stopwords": "_russian_"
        },
        "ru_stemmer": {
          "type": "stemmer",
          "language": "russian"
        }
      },
      "analyzer": {
        "default": {
          "char_filter": [
            "html_strip"
          ],
          "tokenizer": "standard",
          "filter": [
            "lowercase",
            "ru_stop",
            "ru_stemmer"
          ]
        }
      }
    }
  },
  "mappings": {
    "post": {
      "properties": {
        "content": {
          "type": "string"
        },
        "published_at": {
          "type": "date"
        },
        "tags": {
          "type": "string",
          "index": "not_analyzed"
        },
        "title": {
          "type": "string"
        }
      }
    }
  }
}'

ಈ ಸೂಚ್ಯಂಕಕ್ಕೆ (blog3) ಅದೇ 2 ಪೋಸ್ಟ್‌ಗಳನ್ನು ಸೇರಿಸೋಣ. ನಾನು ಈ ಪ್ರಕ್ರಿಯೆಯನ್ನು ಬಿಟ್ಟುಬಿಡುತ್ತೇನೆ ಏಕೆಂದರೆ... ಇದು ಬ್ಲಾಗ್ ಸೂಚ್ಯಂಕಕ್ಕೆ ಡಾಕ್ಯುಮೆಂಟ್‌ಗಳನ್ನು ಸೇರಿಸುವುದಕ್ಕೆ ಹೋಲುತ್ತದೆ.

ಅಭಿವ್ಯಕ್ತಿ ಬೆಂಬಲದೊಂದಿಗೆ ಪೂರ್ಣ ಪಠ್ಯ ಹುಡುಕಾಟ

ಇನ್ನೊಂದು ರೀತಿಯ ವಿನಂತಿಯನ್ನು ನೋಡೋಣ:

# найдем документы, в которых встречается слово 'истории'
# query -> simple_query_string -> query содержит поисковый запрос
# поле title имеет приоритет 3
# поле tags имеет приоритет 2
# поле content имеет приоритет 1
# приоритет используется при ранжировании результатов
curl -XPOST "$ES_URL/blog2/post/_search?pretty" -d'
{
  "query": {
    "simple_query_string": {
      "query": "истории",
      "fields": [
        "title^3",
        "tags^2",
        "content"
      ]
    }
  }
}'

ಏಕೆಂದರೆ ನಾವು ರಷ್ಯಾದ ಸ್ಟೆಮ್ಮಿಂಗ್‌ನೊಂದಿಗೆ ವಿಶ್ಲೇಷಕವನ್ನು ಬಳಸುತ್ತಿದ್ದೇವೆ, ನಂತರ ಈ ವಿನಂತಿಯು ಎಲ್ಲಾ ದಾಖಲೆಗಳನ್ನು ಹಿಂತಿರುಗಿಸುತ್ತದೆ, ಆದರೂ ಅವುಗಳು 'ಇತಿಹಾಸ' ಪದವನ್ನು ಮಾತ್ರ ಒಳಗೊಂಡಿರುತ್ತವೆ.

ವಿನಂತಿಯು ವಿಶೇಷ ಅಕ್ಷರಗಳನ್ನು ಒಳಗೊಂಡಿರಬಹುದು, ಉದಾಹರಣೆಗೆ:

""fried eggs" +(eggplant | potato) -frittata"

ಸಿಂಟ್ಯಾಕ್ಸ್ ವಿನಂತಿ:

+ signifies AND operation
| signifies OR operation
- negates a single token
" wraps a number of tokens to signify a phrase for searching
* at the end of a term signifies a prefix query
( and ) signify precedence
~N after a word signifies edit distance (fuzziness)
~N after a phrase signifies slop amount
# найдем документы без слова 'щенки'
curl -XPOST "$ES_URL/blog2/post/_search?pretty" -d'
{
  "query": {
    "simple_query_string": {
      "query": "-щенки",
      "fields": [
        "title^3",
        "tags^2",
        "content"
      ]
    }
  }
}'

# получим 2 поста про котиков

ಉಲ್ಲೇಖಗಳು

PS

ನೀವು ಒಂದೇ ರೀತಿಯ ಲೇಖನಗಳು-ಪಾಠಗಳಲ್ಲಿ ಆಸಕ್ತಿ ಹೊಂದಿದ್ದರೆ, ಹೊಸ ಲೇಖನಗಳಿಗೆ ಆಲೋಚನೆಗಳನ್ನು ಹೊಂದಿದ್ದರೆ ಅಥವಾ ಸಹಕಾರಕ್ಕಾಗಿ ಪ್ರಸ್ತಾಪಗಳನ್ನು ಹೊಂದಿದ್ದರೆ, ವೈಯಕ್ತಿಕ ಸಂದೇಶದಲ್ಲಿ ಅಥವಾ ಇಮೇಲ್ ಮೂಲಕ ಸಂದೇಶವನ್ನು ಸ್ವೀಕರಿಸಲು ನಾನು ಸಂತೋಷಪಡುತ್ತೇನೆ [ಇಮೇಲ್ ರಕ್ಷಿಸಲಾಗಿದೆ].

ಮೂಲ: www.habr.com