Elasticsearch | 使用copy_to进行部分搜索

5
我可以帮忙翻译。以下是需要翻译的内容:

我已经成功地使用copy_to进行了精确匹配,但我无法正确地将其与部分匹配设置配合使用。下面是我的映射/设置和查询,以及预期和实际结果。

设置:

{
   "test": {
      "settings": {
         "index": {
            "analysis": {
               "filter": {
                  "ngram_filter": {
                     "type": "edge_ngram",
                     "min_gram": "1",
                     "max_gram": "15"
                  }
               },
               "analyzer": {
                  "ngram_analyzer": {
                     "filter": [
                        "lowercase",
                        "ngram_filter"
                     ],
                     "type": "custom",
                     "tokenizer": "standard"
                  }
               }
            },
            "number_of_shards": "1",
            "number_of_replicas": "1",
           }
      }
   }
}

映射:

POST /test/_mapping/name
{
   "name": {
      "properties": {
         "vital": {
            "properties": {
               "first": {
                  "type": "string",
                  "copy_to": "full_name",
                   "term_vector": "yes",
                    "analyzer": "ngram_analyzer",
                    "search_analyzer": "standard"
               },
               "last": {
                  "type": "string",
                  "copy_to": "full_name",
                   "term_vector": "yes",
                    "analyzer": "ngram_analyzer",
                    "search_analyzer": "standard"
               },
               "full_name": {
                  "type": "string",
                   "term_vector": "yes",
                    "analyzer": "ngram_analyzer",
                    "search_analyzer": "standard"
               }
            }
         }
      }
   }
}

POST:
POST /test/name 
{
   "vital": {
      "first": "Tom",
      "last": "Doe"
   }
}

现在当我进行搜索时...
GET /test/name/_search
{
  "query": {
    "match": {
      "full_name": { 
        "query": "Tom Doe",
        "operator": "and"
      }
    }
  }
}

我得到了结果!!太棒了,但如果我做搜索......

GET /test/name/_search
{
  "query": {
    "match": {
      "full_name": { 
        "query": "Tom Do",
        "operator": "and"
      }
    }
  }
}

我没有得到任何结果 :( 我希望全名的部分匹配也能起作用。另外,我成功地对名字和姓氏进行了部分匹配。只有全名无法正常工作。我该如何解决这个问题?

2个回答

5

您的映射中有一个小错误,您需要将名字和姓氏都复制到 vital.full_name字段中,而不仅仅是full_name,否则将在您的映射顶级创建一个名为full_name的新字符串字段,并使用标准分析器(如果运行GET test,则会在映射中看到这个新字段):

POST /test/_mapping/name
{
   "name": {
      "properties": {
         "vital": {
            "properties": {
               "first": {
                  "type": "string",
                  "copy_to": "vital.full_name",      <--- fix this
                   "term_vector": "yes",
                    "analyzer": "ngram_analyzer",
                    "search_analyzer": "standard"
               },
               "last": {
                  "type": "string",
                  "copy_to": "vital.full_name",      <--- fix this
                   "term_vector": "yes",
                    "analyzer": "ngram_analyzer",
                    "search_analyzer": "standard"
               },
               "full_name": {
                  "type": "string",
                   "term_vector": "yes",
                    "analyzer": "ngram_analyzer",
                    "search_analyzer": "standard"
               }
            }
         }
      }
   }
}

然后,您需要像这样修复您的查询:
POST /test/name/_search
{
  "query": {
    "match": {
      "vital.full_name": {          <-- fix this
        "query": "Tom Doe",
        "operator": "and"
      }
    }
  }
}

POST /test/name/_search
{
  "query": {
    "match": {
      "vital.full_name": {          <-- fix this
        "query": "Tom Do",
        "operator": "and"
      }
    }
  }
}

两种方法都可以按照你的预期工作。


1

我刚刚尝试了你的方法,不幸的是它不能返回full_name的部分匹配。 - emarel

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接