Elasticsearch | copy_to部分搜索

问题描述:

我有copy_to正确匹配工作,但我无法正确设置与部分匹配。以下是我的映射/设置和查询与预期和实际结果。Elasticsearch | 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" 
     } 
    } 
    } 
} 

...我找回结果!! Hurrraaaay,但如果我做了搜索....

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

...我回来没有结果:(我想部分匹配为FULL_NAME工作,以及作为另一个不是我能够成功地因部分匹配的名字和姓氏,只是full_name不起作用,我会怎么做呢?

你在映射中有一个小错误,你需要复制fir st和姓氏放到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" 
     } 
    } 
    } 
} 

像您期望双方会工作。

+0

还需要什么? – Val

+0

不,不错! – emarel

只是从你映射中删除"search_analyzer": "standard",它只是在某些用例中需要的东西,比如自动完成搜索。这里https://www.elastic.co/guide/en/elasticsearch/guide/master/_index_time_search_as_you_type.html

+0

我刚试过你的方法,不幸的是它不会返回full_name的部分匹配 – emarel