Elasticsearch查询按术语拆分URL

时间:2016-03-01 13:43:28

标签: url elasticsearch tokenize analysis

在Elasticsearch中,我想查询术语并从URL获取结果。因此,我试图让这个领域" url"通过以下方式进行分析和查询 - 但结果总是空的。

指数-config.json:

{
  "mappings": {
    "Mytype": {
      "properties": {
        "about": {
          "url": {
            "type": "string",
            "analyzer":"url_analyzer"
  }}}}},
  "settings" : {
    "analysis": {
      "analyzer": {
        "url_analyzer": {
          "type": "custom",
          "tokenizer": "url_tokenizer"
        }
      },
      "tokenizer": {
        "url_tokenizer" : {
          "type": "pattern",
          "pattern": "[\\.:/]+"
}}}}}

在head-plugin中查询:

{
  "query": {
    "bool": {
      "must": [{
          "query_string": {
            "default_field": "Mytype.url",
            "query": "myquery"
      }}],
      "must_not": [],
      "should": []
  }},
  "from": 0,
  "size": 10,
  "sort": [],
  "facets": {}
}

(我通过Java API查询的方式有点不同 - 出现同样的问题。)

结果:

现在,如果我采取例如stackoverflow.com为myquery 但如果我仅使用stackoverflow,则结果为空。

这让我感到困惑,因为我认为url_tokenizer的模式应该将.作为限制器。

这里有什么问题?

1 个答案:

答案 0 :(得分:2)

我遇到了这个,因为我也在寻找一个弹性搜索分析器,我可以搜索stackoverflowstackoverflow.com。我也认为你的模式标记器看起来应该可以工作,但它也不适合我。我没有查看为什么没有这样做,而是仅使用内置的lowercase tokenizer将所有非字母字符上的标记分开,这对于URL中包含非字母字符的域不完美,但足够好对于我的用例。我还过滤了httphttps令牌,因此单独搜索任何一个都不会返回每个结果,但搜索http://stackoverflow.com仍然有效。

"analysis": {
  "filter": {
    "url_stop": {
      "type": "stop",
      "stopwords": ["http", "https"]
    }
  },
  "analyzer": {
    "url_analyzer": {
        "tokenizer": "lowercase",
        "filter": "url_stop"
    }
  }
}

并在映射中使用它:

"mappings": {
  "my_mapping": {
    "properties": {
      "url": {
        "analyzer": "url_analyzer",
        "type": "string"
      }
    }
  }
}

希望OP已经解决了他们的问题,但也许这对未来的其他人有用。