首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >带通配符的Elasticsearch - query_string

带通配符的Elasticsearch - query_string
EN

Stack Overflow用户
提问于 2016-01-19 21:40:12
回答 2查看 1.6K关注 0票数 1

我有一些弹性搜索文本,包含各种格式的urls (http://www,www.)我想做的是搜索所有包含google.com的文本。

对于当前的搜索,我使用如下查询:

代码语言:javascript
复制
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,因为我想使用布尔运算符,但是我真的需要能够搜索子字符串,而不仅仅是整个单词。

谢谢!

EN

回答 2

Stack Overflow用户

发布于 2016-01-25 05:58:20

确实,标准分析器将http://www.google.com标记为httpwww.google.com,因此不会找到google.com

因此,仅用标准分析器是没有帮助的,我们需要一个令牌过滤器来正确地转换URL令牌。另一种方法是,如果您的text字段只包含URL,则应该使用UAX电子邮件URL令牌程序,但是由于该字段可以包含任何其他文本(即用户注释),它将无法工作。

幸运的是,有一个名为分析-url的新插件,它提供了一个URL令牌过滤器,这正是我们所需要的(在我请求的小修改之后,谢谢@jlinn ;-)

首先,您需要安装插件:

代码语言:javascript
复制
bin/plugin install https://github.com/jlinn/elasticsearch-analysis-url/releases/download/v2.2.0/elasticsearch-analysis-url-2.2.0.zip

然后,我们就可以开始玩了。我们需要为您的text字段创建适当的分析器:

代码语言:javascript
复制
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

代码语言:javascript
复制
curl -XGET 'localhost:9200/urls/_analyze?analyzer=url_host&pretty' -d 'blabla bla http://www.google.com blabla'

我们将得到以下令牌:

代码语言:javascript
复制
{
  "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

因此,如果您的searchStringgoogle.com,那么您将能够找到包含google.com (或www.google.com)的text字段的所有文档。

票数 1
EN

Stack Overflow用户

发布于 2016-01-19 21:48:05

全文搜索总是关于倒排索引中的精确匹配,除非执行强制遍历倒排索引的通配符搜索。在queryString开始时使用通配符将导致索引的全面遍历,因此不建议使用。

不仅要考虑索引URL,还要考虑应用关键词托卡器的域(通过去掉协议、子域和域后面的任何信息)。然后,您可以针对此字段搜索域。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/34887458

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档