按令牌计数过滤搜索

search with filter by token count

分析文档中的字段以创建令牌。

  1. {"message":"hello world"} -> 令牌:["hello", "world"]
  2. {"message":"hello"} -> 令牌:["hello"]
  3. {"message":"world"} -> 令牌:["world"]
  4. {"message":"hello java"} -> 令牌:["hello", "java"]
  5. {"message":"java"} -> 令牌:["java"]

是否可以搜索特定字段包含给定标记和 1 个或多个标记的所有文档?

termvectors 中所述,可以访问代币或有关它们的统计信息。这仅适用于特定文档,但不适用于查询或聚合的搜索过滤器。
如果有人能帮忙就好了。

是的,您可以为此使用 token_count 类型。例如,在您的映射中,您可以将 message 定义为多字段以包含消息本身(即 "hello"、"hello world" 等)以及消息的标记数.然后您就可以在查询中包含字数限制。

因此 message 的映射应如下所示:

curl -XPUT localhost:9200/tests -d '
{
  "mappings": {
    "test": {
      "properties": {
        "message": {
          "type": "string",           <--- message is a normal analyzed string
          "fields": {
            "word_count": {           <--- a sub-field to include the word count
              "type": "token_count",
              "store": "yes",
              "analyzer": "standard"
            }
          }
        }
      }
    }
  }
}

然后,您可以查询消息中包含 hello 的所有文档,但只能查询 message 具有多个标记的文档。使用以下查询,您只会得到 hello javahello world,但不会得到 hello

curl -XPOST localhost:9200/tests/test/_search -d '
{
  "query": {
    "bool": {
      "must": [
        {
          "match": {
            "message": "hello"
          }
        },
        {
          "range": {
            "message.word_count": {
              "gt": 1
            }
          }
        }
      ]
    }
  }
}

同样,如果在上述查询中将 hello 替换为 world,您将只会得到 hello world.