elasticsearch Elastic matchQuery for name

carvr3hs  于 7个月前  发布在  ElasticSearch
关注(0)|答案(2)|浏览(77)

我有一个弹性字段,其中包含一个用户名,例如。我的名字将包含john doe
我正在尝试创建一个匹配查询,以便能够通过以下短语找到我的名字:

  • john d
  • john do
  • doe

我的查询:

{
        "bool" : {
          "should" : [
            {
              "match" : {
                "keywords" : {
                  "query" : "john do",
                  "operator" : "AND",
                  "prefix_length" : 0,
                  "max_expansions" : 50,
                  "minimum_should_match" : "50%",
                }
              }
            }
          ]
        }
      }

字符串
问题是johnjohn do将找不到任何东西,因为AND运算符。如果我切换到OR,搜索john doe实际上会选择数据库中的每一个john,我的姓氏甚至不会出现在最上面的结果。
对于这样的搜索,查询应该如何形成?

lb3vh1jj

lb3vh1jj1#

你应该使用match phrase prefix query,在下面的示例上测试过,根据你的用例,它似乎工作得很好。

样本文件

{
    "name" :  "john doe"
}

{
    "name" :  "john"
    
}

{
    "name" :  "john do"

}

字符串

使用匹配短语前缀搜索查询

{
  "query": {
    "match_phrase_prefix": {
      "name": {
        "query": "john d"
      }
    }
  }
}

7gyucuyw

7gyucuyw2#

我认为edge_ngrams应该在这种情况下工作。请尝试以下操作:
设置索引以使用edge_ngrams作为索引分析器。

PUT test 
{
  "mappings": {
    "properties": {
      "name":{
        "type": "text",
        "analyzer": "custom_analyzer",
        "search_analyzer": "standard"
      }
    }
  },
  "settings": {
    "analysis": {
      "filter": {
        "custom_edge_ngram":
        {
          "type": "edge_ngram",
          "min_gram": 1,
          "max_gram": 10
        }
      },
      "analyzer": {
          "custom_analyzer":{
            "tokenizer":"standard",
            "filter":[
              "lowercase",
              "custom_edge_ngram"]
          }
      }
    }
  }
}

字符串
然后使用以下查询查询索引:

GET test/_search
{
  "query": {
    "match": {
      "name": 
      {
        "query":"vojtech k",
        "operator": "and"
      }
    }
  }
}

解释:

edge ngram索引分析器将为索引中的name字段生成最小长度为1,最大长度为10的ngram
您可以使用以下命令检查令牌:

GET test/_analyze
{
  "analyzer": "custom_analyzer",
  "text": ["vojtech knyttl"]
}


当你使用匹配查询搜索时,它会在你的文档中找到vojtech和k作为ngrams。
我的测试案例vojtech亚当斯,vojtech knyttl,vojtech,joe knyttl
如果我搜索vojtech knyttl它返回1结果。
如果我搜索vojtech,我会得到vojtech亚当斯,vojtech knyttl,vojtech
如果我搜索vojteck k我得到vojtech knyttl
如果我搜索knyttl我得到vojtech knyttl,乔knyttl

相关问题