geoip.asciidoc 9.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299
  1. [[geoip-processor]]
  2. === GeoIP Processor
  3. The `geoip` processor adds information about the geographical location of IP addresses, based on data from the Maxmind databases.
  4. This processor adds this information by default under the `geoip` field. The `geoip` processor can resolve both IPv4 and
  5. IPv6 addresses.
  6. The `ingest-geoip` module ships by default with the GeoLite2 City, GeoLite2 Country and GeoLite2 ASN geoip2 databases from Maxmind made available
  7. under the CCA-ShareAlike 4.0 license. For more details see, http://dev.maxmind.com/geoip/geoip2/geolite2/
  8. The `geoip` processor can run with other GeoIP2 databases from Maxmind. The files must be copied into the `ingest-geoip` config directory,
  9. and the `database_file` option should be used to specify the filename of the custom database. Custom database files must be stored
  10. uncompressed. The `ingest-geoip` config directory is located at `$ES_CONFIG/ingest-geoip`.
  11. [[using-ingest-geoip]]
  12. ==== Using the `geoip` Processor in a Pipeline
  13. [[ingest-geoip-options]]
  14. .`geoip` options
  15. [options="header"]
  16. |======
  17. | Name | Required | Default | Description
  18. | `field` | yes | - | The field to get the ip address from for the geographical lookup.
  19. | `target_field` | no | geoip | The field that will hold the geographical information looked up from the Maxmind database.
  20. | `database_file` | no | GeoLite2-City.mmdb | The database filename in the geoip config directory. The ingest-geoip module ships with the GeoLite2-City.mmdb, GeoLite2-Country.mmdb and GeoLite2-ASN.mmdb files.
  21. | `properties` | no | [`continent_name`, `country_iso_code`, `region_iso_code`, `region_name`, `city_name`, `location`] * | Controls what properties are added to the `target_field` based on the geoip lookup.
  22. | `ignore_missing` | no | `false` | If `true` and `field` does not exist, the processor quietly exits without modifying the document
  23. |======
  24. *Depends on what is available in `database_file`:
  25. * If the GeoLite2 City database is used, then the following fields may be added under the `target_field`: `ip`,
  26. `country_iso_code`, `country_name`, `continent_name`, `region_iso_code`, `region_name`, `city_name`, `timezone`, `latitude`, `longitude`
  27. and `location`. The fields actually added depend on what has been found and which properties were configured in `properties`.
  28. * If the GeoLite2 Country database is used, then the following fields may be added under the `target_field`: `ip`,
  29. `country_iso_code`, `country_name` and `continent_name`. The fields actually added depend on what has been found and which properties
  30. were configured in `properties`.
  31. * If the GeoLite2 ASN database is used, then the following fields may be added under the `target_field`: `ip`,
  32. `asn`, and `organization_name`. The fields actually added depend on what has been found and which properties were configured
  33. in `properties`.
  34. Here is an example that uses the default city database and adds the geographical information to the `geoip` field based on the `ip` field:
  35. [source,console]
  36. --------------------------------------------------
  37. PUT _ingest/pipeline/geoip
  38. {
  39. "description" : "Add geoip info",
  40. "processors" : [
  41. {
  42. "geoip" : {
  43. "field" : "ip"
  44. }
  45. }
  46. ]
  47. }
  48. PUT my_index/_doc/my_id?pipeline=geoip
  49. {
  50. "ip": "8.8.8.8"
  51. }
  52. GET my_index/_doc/my_id
  53. --------------------------------------------------
  54. Which returns:
  55. [source,console-result]
  56. --------------------------------------------------
  57. {
  58. "found": true,
  59. "_index": "my_index",
  60. "_id": "my_id",
  61. "_version": 1,
  62. "_seq_no": 55,
  63. "_primary_term": 1,
  64. "_source": {
  65. "ip": "8.8.8.8",
  66. "geoip": {
  67. "continent_name": "North America",
  68. "country_iso_code": "US",
  69. "location": { "lat": 37.751, "lon": -97.822 }
  70. }
  71. }
  72. }
  73. --------------------------------------------------
  74. // TESTRESPONSE[s/"_seq_no": \d+/"_seq_no" : $body._seq_no/ s/"_primary_term":1/"_primary_term" : $body._primary_term/]
  75. Here is an example that uses the default country database and adds the
  76. geographical information to the `geo` field based on the `ip` field`. Note that
  77. this database is included in the module. So this:
  78. [source,console]
  79. --------------------------------------------------
  80. PUT _ingest/pipeline/geoip
  81. {
  82. "description" : "Add geoip info",
  83. "processors" : [
  84. {
  85. "geoip" : {
  86. "field" : "ip",
  87. "target_field" : "geo",
  88. "database_file" : "GeoLite2-Country.mmdb"
  89. }
  90. }
  91. ]
  92. }
  93. PUT my_index/_doc/my_id?pipeline=geoip
  94. {
  95. "ip": "8.8.8.8"
  96. }
  97. GET my_index/_doc/my_id
  98. --------------------------------------------------
  99. returns this:
  100. [source,console-result]
  101. --------------------------------------------------
  102. {
  103. "found": true,
  104. "_index": "my_index",
  105. "_id": "my_id",
  106. "_version": 1,
  107. "_seq_no": 65,
  108. "_primary_term": 1,
  109. "_source": {
  110. "ip": "8.8.8.8",
  111. "geo": {
  112. "continent_name": "North America",
  113. "country_iso_code": "US",
  114. }
  115. }
  116. }
  117. --------------------------------------------------
  118. // TESTRESPONSE[s/"_seq_no": \d+/"_seq_no" : $body._seq_no/ s/"_primary_term" : 1/"_primary_term" : $body._primary_term/]
  119. Not all IP addresses find geo information from the database, When this
  120. occurs, no `target_field` is inserted into the document.
  121. Here is an example of what documents will be indexed as when information for "80.231.5.0"
  122. cannot be found:
  123. [source,console]
  124. --------------------------------------------------
  125. PUT _ingest/pipeline/geoip
  126. {
  127. "description" : "Add geoip info",
  128. "processors" : [
  129. {
  130. "geoip" : {
  131. "field" : "ip"
  132. }
  133. }
  134. ]
  135. }
  136. PUT my_index/_doc/my_id?pipeline=geoip
  137. {
  138. "ip": "80.231.5.0"
  139. }
  140. GET my_index/_doc/my_id
  141. --------------------------------------------------
  142. Which returns:
  143. [source,console-result]
  144. --------------------------------------------------
  145. {
  146. "_index" : "my_index",
  147. "_id" : "my_id",
  148. "_version" : 1,
  149. "_seq_no" : 71,
  150. "_primary_term": 1,
  151. "found" : true,
  152. "_source" : {
  153. "ip" : "80.231.5.0"
  154. }
  155. }
  156. --------------------------------------------------
  157. // TESTRESPONSE[s/"_seq_no" : \d+/"_seq_no" : $body._seq_no/ s/"_primary_term" : 1/"_primary_term" : $body._primary_term/]
  158. [[ingest-geoip-mappings-note]]
  159. ===== Recognizing Location as a Geopoint
  160. Although this processor enriches your document with a `location` field containing
  161. the estimated latitude and longitude of the IP address, this field will not be
  162. indexed as a {ref}/geo-point.html[`geo_point`] type in Elasticsearch without explicitly defining it
  163. as such in the mapping.
  164. You can use the following mapping for the example index above:
  165. [source,console]
  166. --------------------------------------------------
  167. PUT my_ip_locations
  168. {
  169. "mappings": {
  170. "properties": {
  171. "geoip": {
  172. "properties": {
  173. "location": { "type": "geo_point" }
  174. }
  175. }
  176. }
  177. }
  178. }
  179. --------------------------------------------------
  180. ////
  181. [source,console]
  182. --------------------------------------------------
  183. PUT _ingest/pipeline/geoip
  184. {
  185. "description" : "Add geoip info",
  186. "processors" : [
  187. {
  188. "geoip" : {
  189. "field" : "ip"
  190. }
  191. }
  192. ]
  193. }
  194. PUT my_ip_locations/_doc/1?refresh=true&pipeline=geoip
  195. {
  196. "ip": "8.8.8.8"
  197. }
  198. GET /my_ip_locations/_search
  199. {
  200. "query": {
  201. "bool" : {
  202. "must" : {
  203. "match_all" : {}
  204. },
  205. "filter" : {
  206. "geo_distance" : {
  207. "distance" : "1m",
  208. "geoip.location" : {
  209. "lon" : -97.822,
  210. "lat" : 37.751
  211. }
  212. }
  213. }
  214. }
  215. }
  216. }
  217. --------------------------------------------------
  218. // TEST[continued]
  219. [source,console-result]
  220. --------------------------------------------------
  221. {
  222. "took" : 3,
  223. "timed_out" : false,
  224. "_shards" : {
  225. "total" : 1,
  226. "successful" : 1,
  227. "skipped" : 0,
  228. "failed" : 0
  229. },
  230. "hits" : {
  231. "total" : {
  232. "value": 1,
  233. "relation": "eq"
  234. },
  235. "max_score" : 1.0,
  236. "hits" : [
  237. {
  238. "_index" : "my_ip_locations",
  239. "_id" : "1",
  240. "_score" : 1.0,
  241. "_source" : {
  242. "geoip" : {
  243. "continent_name" : "North America",
  244. "country_iso_code" : "US",
  245. "location" : {
  246. "lon" : -97.822,
  247. "lat" : 37.751
  248. }
  249. },
  250. "ip" : "8.8.8.8"
  251. }
  252. }
  253. ]
  254. }
  255. }
  256. --------------------------------------------------
  257. // TESTRESPONSE[s/"took" : 3/"took" : $body.took/]
  258. ////
  259. [[ingest-geoip-settings]]
  260. ===== Node Settings
  261. The `geoip` processor supports the following setting:
  262. `ingest.geoip.cache_size`::
  263. The maximum number of results that should be cached. Defaults to `1000`.
  264. Note that these settings are node settings and apply to all `geoip` processors, i.e. there is one cache for all defined `geoip` processors.