【问题标题】:ElasticSearch Percolate queries with arraysElasticSearch 使用数组过滤查询
【发布时间】:2020-08-04 18:54:15
【问题描述】:

我有一个针对不同用户的黑名单单词列表(5k-10k 单词)和一个电影标题,我需要搜索黑名单单词。

我想知道电影标题是否包含特定用户的任何列入黑名单的单词,因此有机会渗透查询解释 here

创建了映射:

PUT /blacklist
{
  "mappings": {
    "properties": {
      "words": {
        "type": "text"
      },
      "query": {
        "type": "percolator"
      }
    }
  }
}

现在索引user id=1的黑名单:

PUT /blacklist/_doc/1?refresh
{
  "query": {
    "terms": {
      "words": ["Star", "Wars", "Trek"]
    }
  }
}

现在尝试搜索 A Journey of some guys on a Star Trek ship 包含用户的任何黑名单字词(答案是,是的)。

GET /blacklist/_search
{
  "query": {
    "percolate": {
      "field": "query",
      "document": {
        "words": "A Journey of some guys on a Star Trek ship"
      }
    }
  }
}

但不幸的是,它没有击中任何文档。

在索引上搜索也不起作用。

GET /blacklist/_search
{
  "query": {
    "terms": {
      "words": ["Star", "Wars", "Trek"]
    }
  }
}
// No hit

这是存储的文档:

GET blacklist/_search
{
    "query": {
        "match_all": {}
    }
}
{
        "_index" : "blacklist",
        "_type" : "_doc",
        "_id" : "1",
        "_score" : 1.0,
        "_source" : {
          "query" : {
            "terms" : {
              "words" : [
                "Star", "Wars", "Trek"
              ]
            }
          }
        }
      }

看起来我无法进行 perculator 查询来处理数组。你能指导我吗?

【问题讨论】:

    标签: elasticsearch


    【解决方案1】:

    这是因为terms 查询的性质。

    terms 不是全文查询,这意味着它们不会被分析。

    {
      "query": {
        "terms": {
          "words": ["Star", "Wars", "Trek"]
        }
      }
    }
    

    在这里,您可以找到所有大小写混合的单词。所以它将按原样存储。 terms

    但是您的数据words 是文本类型,这意味着

    A Journey of some guys on a Star Trek ship 将被标记化。这里每个单词都使用默认的standard tokenizer 进行标记,其中包括lowercase filter。所以Star 将被存储为star

    因此Star 与搜索词star 不匹配。

    要使其工作,请在下面使用

    {
      "query": {
        "terms": {
          "words": ["star", "wars", "trek"] //lowercase
        }
      }
    }
    

    【讨论】:

    • 好的,谢谢。工作很棒。我还需要知道电影标题中存在哪些列入黑名单的单词。有什么办法知道吗?谢谢
    • 我认为没有办法。但是,我会重新检查一次,让您知道是否有任何方法。很高兴它有帮助。
    猜你喜欢
    • 1970-01-01
    • 2015-05-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-12-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多