匹配查询,在字段中匹配多个单词

jutyujz0  于 2021-06-14  发布在  ElasticSearch
关注(0)|答案(1)|浏览(427)

如何在有多个关键字的字段上应用匹配查询,例如“los angeles”中有两个单词。如何从下面的数据结构进行匹配

"addresses" : [
        {
          "type" : "Home",
          "address" : "Los Angeles,CA,US"
        }
      ]

下面是我的Map和设置,创建了自定义设置和过滤器

PUT /test
 {
   "settings": {
     "analysis": {
       "filter" : {
             "my_word_delimiter" : {
                 "type" : "word_delimiter",
                 "type_table": [
                   "# => ALPHANUM",
                   "+ => ALPHANUM",
                   "@ => ALPHANUM",
                          "% => ALPHANUM",
                          "~ => ALPHANUM",
                          "^ => ALPHANUM",
                          "$ => ALPHANUM",
                          "& => ALPHANUM",
                          "' => ALPHANUM",
                          "\" => ALPHANUM",
                          "\/ => ALPHANUM",
                          ", => ALPHANUM"
                 ],
                 "preserve_original": "true",
                 "generate_word_parts":false,
                 "generate_number_parts":false,
                 "split_on_case_change":false,
                 "split_on_numerics":false,
                 "stem_english_possessive":false
             }   
         },
       "analyzer": {
             "default": {
                "type": "custom",
                "tokenizer": "whitespace",
                "filter": [
                   "lowercase",
                   "my_word_delimiter"
                ]
             }
          },
       "normalizer": {
         "keyword_lowercase": {
           "type": "custom",
           "filter": [
             "lowercase"
           ]
         }
       }
     }
   },
   "mappings": {
     "dynamic": "strict",
     "properties": {
      "addresses": {
         "type": "nested",
         "properties": {
           "address": {
             "type": "text"
           },
           "type": {
             "type": "keyword"
           }
         }
       }
     }
   }
 }

尝试了下面的查询,但没有得到结果

{
   "from": "0",
   "size": "30",
   "query": {
     "bool": {
       "must": [
         {
           "bool": {
             "should": [
               {
                 "nested": {
                   "path": "addresses",
                   "query": {
                     "match": {
                       "addresses.address": {
                         "query": "Los Angeles",
                         "operator": "and"
                       }
                     }
                   }
                 }
               }
             ]
           }
         }
       ]
     }
   },
   "sort": [
     {
       "_score": {
         "order": "desc"
       }
     }
   ]
 }

创建的设置有问题吗

v64noz0r

v64noz0r1#

如果地址的值为 "Los Angeles,CA,US" ,因为您正在使用 whitespace 标记器。
每当遇到空白字符时,空白标记符就会将文本分解为术语。
既然你用的是 and 操作员 match 查询,因此查询应该检索同时具有这两个属性的数据 Los 以及 Angeles ,但由于空格标记器,没有 Angeles 生成,因此不返回任何结果。

POST/_analyze
    {
      "tokenizer": "whitespace",
      "text": "Los Angeles,CA,US"
    }

代币包括:

{
  "tokens": [
    {
      "token": "Los",
      "start_offset": 0,
      "end_offset": 3,
      "type": "word",
      "position": 0
    },
    {
      "token": "Angeles,CA,US",
      "start_offset": 4,
      "end_offset": 17,
      "type": "word",
      "position": 1
    }
  ]
}

但在这种情况下 "Los Angeles ,CA,US" ,因为后面有一个空格 Angeles ,因此生成的令牌是: Los , Angeles , ,CA,US 添加索引数据、Map和搜索结果的工作示例
索引Map:
保持Map不变,除了从 whitespace"tokenizer":"standard" 分析api
标准标记器提供基于语法的标记化

{
  "tokenizer": "standard",
  "text": "Los Angeles ,CA,US"
}

代币包括:

{
  "tokens": [
    {
      "token": "Los",
      "start_offset": 0,
      "end_offset": 3,
      "type": "<ALPHANUM>",
      "position": 0
    },
    {
      "token": "Angeles",
      "start_offset": 4,
      "end_offset": 11,
      "type": "<ALPHANUM>",
      "position": 1
    },
    {
      "token": "CA",
      "start_offset": 13,
      "end_offset": 15,
      "type": "<ALPHANUM>",
      "position": 2
    },
    {
      "token": "US",
      "start_offset": 16,
      "end_offset": 18,
      "type": "<ALPHANUM>",
      "position": 3
    }
  ]
}

索引数据:

{
  "addresses": [
    {
      "type": "Home",
      "address": "Los Angeles,CA,US"
    }
  ]
}

使用与结果中给定的相同的搜索查询
搜索结果:

"hits": [
      {
        "_index": "64624353",
        "_type": "_doc",
        "_id": "1",
        "_score": 0.26706278,
        "_source": {
          "addresses": [
            {
              "type": "Home",
              "address": "Los Angeles,CA,US"
            }
          ]
        }
      }
    ]

注意:如果您想使用 whitespace 标记器,然后删除 "operator": "and" 从搜索查询中,您将得到所需的结果
更新1:
尝试使用此更新的Map:

{
  "settings": {
    "analysis": {
      "filter": {
        "my_word_delimiter": {
          "type": "word_delimiter",
          "type_table": [
            "# => ALPHANUM",
            "+ => ALPHANUM",
            "@ => ALPHANUM",
            "% => ALPHANUM",
            "~ => ALPHANUM",
            "^ => ALPHANUM",
            "$ => ALPHANUM",
            "& => ALPHANUM",
            "' => ALPHANUM",
            "\" => ALPHANUM",
            "\/ => ALPHANUM"
          ],
          "preserve_original": "true",
          "generate_word_parts": true,
          "generate_number_parts": false,
          "split_on_case_change": false,
          "split_on_numerics": false,
          "stem_english_possessive": false
        }
      },
      "analyzer": {
        "default": {
          "type": "custom",
          "tokenizer": "whitespace",
          "filter": [
            "lowercase",
            "my_word_delimiter"
          ]
        }
      },
      "normalizer": {
        "keyword_lowercase": {
          "type": "custom",
          "filter": [
            "lowercase"
          ]
        }
      }
    }
  },
  "mappings": {
    "dynamic": "strict",
    "properties": {
      "addresses": {
        "type": "nested",
        "properties": {
          "address": {
            "type": "text"
          },
          "type": {
            "type": "keyword"
          }
        }
      }
    }
  }
}

生成\u单词\u部分设置为 true 以便过滤器在输出中包含由字母字符组成的标记。
字分隔符标记筛选器,在非字母数字字符处拆分标记。已删除 ", => ALPHANUM" ,来自 type_table

相关问题