您好, 欢迎来到 !    登录 | 注册 | | 设为首页 | 收藏本站

在Elasticsearch中查询以特定单词开头的字符串

在Elasticsearch中查询以特定单词开头的字符串

在这种特殊情况下,限制令牌过滤器将非常有用。您可以通过两种不同的方法来分析 character_name 字段,一种用于标准搜索操作,另一种用于获取以特定单词开头的字符串。我这样创建了样本索引。 仅索引字符串的第一个标记

PUT character
{
  "settings": {
    "analysis": {
      "analyzer": {
        "character_analyzer": {
          "tokenizer": "whitespace",
          "filter": [
            "lowercase",
            "one_token_limit"
          ]
        }
      },
      "filter": {
        "one_token_limit": {
          "type": "limit",
          "max_token_count": 1
        }
      }
    }
  },
  "mappings": {
    "mytype": {
      "properties": {
        "character_name": {
          "type": "string",
          "fields": {
            "only_first": {
              "type": "string",
              "analyzer": "character_analyzer"
            }
          }
        }
      }
    }
  }
}

然后像这样查询 only_first 字段

{
  "query": {
    "query_string": {
      "fields": ["character_name.only_first"],
      "query": "Donald"
    }
  }
}

这将为您提供所需的结果。我已经使用了空白标记器,但是如果要匹配“唐纳德·唐纳德鸭”,也可以使用标准标记器。

另一种方法跨度优先查询,但是问题是,term query这样“唐纳德”将匹配但“唐纳德”将不匹配

{
    "span_first" : {
        "match" : {
            "span_term" : { "character_name" : "donald" }
        },
        "end" : 1
    }
}

但是“唐纳德”将为您提供零结果( ),但是第一种方法肯定会起作用。

:前缀匹配

您可以像这样先在范围内包装前缀查询

{
  "query": {
    "span_first": {
      "match": {
        "span_multi": {
          "match": {
            "prefix": {
              "character_name": {
                "value": "don"
              }
            }
          }
        }
      },
      "end": 1
    }
  }
}

查询中使用 。

希望能帮助到你!

其他 2022/1/1 18:24:41 有513人围观

撰写回答


你尚未登录,登录后可以

和开发者交流问题的细节

关注并接收问题和回答的更新提醒

参与内容的编辑和改进,让解决方法与时俱进

请先登录

推荐问题


联系我
置顶