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

时间:2016-10-18 13:29:35

标签: elasticsearch

我想在elasticsearch中编写一个查询,这样它只会给出字符串从特定单词开始的结果,例如我有一个字符串“Donald Duck”,另一个字符串是“Alan Donald”,如果我将搜索对于具有以下查询的“唐纳德”

"query": {
     query_string: {
         query: "Donald",
         fields: ['character_name']
     }
 }
然后结果应该是“唐老鸭”不是“艾伦唐纳德”,因为在“唐老鸭”中它以“唐纳德”开头。现在任何人都可以告诉我如何编写这样的查询,我搜索了很多帖子但没有找到任何解决方案。

Edit-1

我的映射在下面给出

"settings": {
        "index": {
                "analysis": {
                    "analyzer": {
                        "simple_wildcard": {
                    "tokenizer": "whitespace",
                    "filter": ["lowercase"]
                        }
                    }
                }
            }
      },
      "mappings" : {
        "college": {
                "properties":{
                    "character_name" : { "type" : "string", "index": "analyzed", "analyzer": "simple_wildcard"}

                }
            }
}

1 个答案:

答案 0 :(得分:1)

在这种特殊情况下,

Limit Token filter会非常有帮助。您可以通过两种不同的方式分析 character_name 字段,一种用于标准搜索操作,另一种用于获取以特定字开头的字符串。我像这样创建了样本索引。 only_first 仅索引字符串的第一个标记。

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"
    }
  }
}

这将为您提供所需的结果。我使用了whitespace标记器,但是如果你想匹配" donald-donald duck"你也可以使用标准标记器。

另一种方式是span first query但问题是它是term query所以' donald'会匹配,但唐纳德'不匹配

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

但是唐纳德'将给你零结果(区分大小写),但第一种方法肯定会有用。

编辑1 :前缀匹配

您可以像这样

首先在span内包装前缀查询
{
  "query": {
    "span_first": {
      "match": {
        "span_multi": {
          "match": {
            "prefix": {
              "character_name": {
                "value": "don"
              }
            }
          }
        }
      },
      "end": 1
    }
  }
}

在查询中使用" *"

希望它有所帮助!