【问题标题】:Elasticsearch query split URL by termElasticsearch 查询按术语拆分 URL
【发布时间】:2016-08-23 02:14:22
【问题描述】:

在 Elasticsearch 中,我想查询术语并从 URL 中获取结果。因此,我尝试让“url”字段按以下方式进行分析和查询-但结果始终为空。

index-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 作为我的查询。
但是结果是空的,如果我只取stackoverflow

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

这里有什么问题?

【问题讨论】:

  • 您的映射似乎格式不正确,即我不确定“properties / about / url”字段,一定缺少某些东西。如果about 是一个对象字段,那么您必须在properties 结构中包含url 子字段。您可以使用curl -XGET localhost:9200/your_index 提取实际映射并用它更新您的问题吗?
  • @Val 感谢您的回复!这是 JSON Schema 表示法,不应该是问题的一部分,因为搜索“stackoverflow.com”和许多其他查询都可以。尽管如此,我还是提取并检查了实际映射。和上面贴的完全一样。
  • 我会尽快检查详细信息,但以下答案应该可以让您抢先一步:stackoverflow.com/questions/34887458/…
  • @Val 我已经安装了 stackoverflow.com/a/34986008/4420271 中提到的分析 url 插件,并且日志告诉我它已经安装且没有错误。重启 ES 后,还是出现如​​下异常:org.elasticsearch.ElasticsearchIllegalArgumentException: failed to find token filter type [url] for [url_host]。 ==> 也许是一个新问题?
  • 我打算提交一个使用该插件的答案,但我还没有完成 :-) 但是从错误来看,它看起来似乎没有明显安装插件。你能确保在 ES 启动时看到它的名字出现在日志中吗?

标签: url elasticsearch tokenize analysis


【解决方案1】:

我遇到了这个问题,因为我也在寻找一个可以搜索 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 解决了他们的问题,但也许这对将来的其他人有用。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-03-21
    • 1970-01-01
    • 1970-01-01
    • 2016-05-15
    • 1970-01-01
    • 1970-01-01
    • 2019-12-06
    • 1970-01-01
    相关资源
    最近更新 更多