我有一些弹性搜索文本,包含各种格式的urls (http://www,www.)我想做的是搜索所有包含google.com的文本。
对于当前的搜索,我使用如下查询:
query = { "query": {
"bool": {
"must": [{
"range": {
"cdate": {
"gt": dfrom,
"lte": dto }
}
},
{ "query_string":{
"default_operator": "AND",
"default_field": "text",
"analyze_wildcard":"true",
"query": searchString } }
]
}
}}但是一个看起来像google.com的查询永远不会返回任何结果,例如,搜索"test“这个词很好(没有)。我确实想使用query_string,因为我想使用布尔运算符,但是我真的需要能够搜索子字符串,而不仅仅是整个单词。
谢谢!
发布于 2016-01-25 05:58:20
确实,标准分析器将http://www.google.com标记为http和www.google.com,因此不会找到google.com。
因此,仅用标准分析器是没有帮助的,我们需要一个令牌过滤器来正确地转换URL令牌。另一种方法是,如果您的text字段只包含URL,则应该使用UAX电子邮件URL令牌程序,但是由于该字段可以包含任何其他文本(即用户注释),它将无法工作。
幸运的是,有一个名为分析-url的新插件,它提供了一个URL令牌过滤器,这正是我们所需要的(在我请求的小修改之后,谢谢@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.comgoogle.com,也就是你所期望的com因此,如果您的searchString是google.com,那么您将能够找到包含google.com (或www.google.com)的text字段的所有文档。
发布于 2016-01-19 21:48:05
全文搜索总是关于倒排索引中的精确匹配,除非执行强制遍历倒排索引的通配符搜索。在queryString开始时使用通配符将导致索引的全面遍历,因此不建议使用。
不仅要考虑索引URL,还要考虑应用关键词托卡器的域(通过去掉协议、子域和域后面的任何信息)。然后,您可以针对此字段搜索域。
https://stackoverflow.com/questions/34887458
复制相似问题