Действительно, http://www.google.com
будет обозначаться стандартным анализатором в http
и www.google.com
и, следовательно, google.com
не будет найден.
Таким образом, стандартный анализатор не поможет здесь, нам нужен фильтр токенов, который правильно преобразует токены URL. Другой способ, если поле text
содержит только URL-адреса, должно было бы использовать UAX Email URL tokenizer, но поскольку поле может содержать любой другой текст (например, комментарии пользователей), это не сработает.
К счастью, есть новый плагин вокруг называется analysis-url который обеспечивает токенов фильтр URL, и это именно то, что нам нужно (после small modification я просил, спасибо @jlinn ;-))
Во-первых, вам нужно установите плагин:
bin/plugin install https://github.com/jlinn/elasticsearch-analysis-url/releases/download/v2.2.0/elasticsearch-analysis-url-2.2.0.zip
Тогда мы можем начать играть. Нам необходимо создать надлежащий анализатор для text
области:
curl -XPUT localhost:9200/test -d '{
"settings": {
"analysis": {
"filter": {
"url_host": {
"type": "url",
"part": "host",
"url_decode": true,
"passthrough": true
}
},
"analyzer": {
"url_host": {
"filter": [
"url_host"
],
"tokenizer": "whitespace"
}
}
}
},
"mappings": {
"url": {
"properties": {
"text": {
"type": "string",
"analyzer": "url_host"
}
}
}
}
}'
С помощью этого анализатора и отображения, мы можем правильно индексировать хост вы хотите, чтобы иметь возможность искать. Например, давайте проанализируем строку blabla bla http://www.google.com blabla
с использованием нашего нового анализатора.
curl -XGET 'localhost:9200/urls/_analyze?analyzer=url_host&pretty' -d 'blabla bla http://www.google.com blabla'
Мы получим следующие символы:
{
"tokens" : [ {
"token" : "blabla",
"start_offset" : 0,
"end_offset" : 0,
"type" : "word",
"position" : 0
}, {
"token" : "bla",
"start_offset" : 0,
"end_offset" : 0,
"type" : "word",
"position" : 1
}, {
"token" : "www.google.com",
"start_offset" : 0,
"end_offset" : 0,
"type" : "word",
"position" : 2
}, {
"token" : "google.com",
"start_offset" : 0,
"end_offset" : 0,
"type" : "word",
"position" : 3
}, {
"token" : "com",
"start_offset" : 0,
"end_offset" : 0,
"type" : "word",
"position" : 4
}, {
"token" : "blabla",
"start_offset" : 0,
"end_offset" : 0,
"type" : "word",
"position" : 5
} ]
}
Как вы можете видеть http://www.google.com
часть будет лексемы в:
www.google.com
google.com
т.е.что вы ожидали
com
Так что теперь, если ваш searchString
является google.com
вы сможете найти все документы, которые имеют text
поле, содержащее google.com
(или www.google.com
).
Что такое отображение вашего URL-адреса? – ChintanShah25
«текст» - это просто текстовое поле. – pinas