2016-04-23 61 views
1

以下是我使用的索引和doc_type的设置和映射。如何在弹性搜索中查询自动完成

es_mapping = { 
    "settings": { 
     "analysis": { 
      "filter": { 
       "edgeNGram_filter": { 
        "type": "edgeNGram", 
        "min_gram": 2, 
        "max_gram": 20, 
        "side": "front" 
       } 
      }, 
      "analyzer": { 
       "edge_nGram_analyzer": { 
        "type": "custom", 
        "tokenizer": "edge_ngram_tokenizer", 
        "filter": [ 
         "lowercase", 
         "asciifolding", 
         "edgeNGram_filter" 
        ] 
       }, 
       "whitespace_analyzer": { 
        "type": "custom", 
        "tokenizer": "whitespace", 
        "filter": [ 
         "lowercase", 
         "asciifolding" 
        ] 
       } 
      }, 
      "tokenizer": { 
       "edge_ngram_tokenizer": { 
        "type": "edgeNGram", 
        "min_gram": "2", 
        "max_gram": "5", 
        "token_chars": [ 
         "letter", 
         "digit" 
        ] 
       } 
      } 
     } 
    }, 
    "mappings": { 
    "videos": { 
     "properties": { 
      "fileName": { 
       "type": "string" 
      }, 
      "path": { 
       "type": "string", 
       "index": "no" 
      } 
     } 
    } 
    } 
} 

# creating index with the above schema. 
es.create_index('media', settings = es_mapping) 

所以,只有两个领域,即文件名路径,我需要做的自动完成的查询。

我添加了所有NGRAM-分析仪空白分析

我提出的是match_phrase

"query": { 
    "match_phrase": { 
     "fileName": { 
      "query": "a" 
     } 
    } 
} 

上面的查询给了我所有匹配的短语查询,基本全文搜索,但我想要类似alt,apple,acer作为建议,只要索引中有提示。

有人可以帮助我改变查询吗?

在此先感谢。 VAL建议后

编辑:

 "settings": { 
     "analysis": { 
      "filter": { 
      "autocomplete_filter": { 
       "type":  "edge_ngram", 
       "min_gram": 1, 
       "max_gram": 20 
      } 
      }, 
      "analyzer": { 
      "autocomplete": { 
       "type":  "custom", 
       "tokenizer": "standard", 
       "filter": [ 
        "lowercase", 
        "autocomplete_filter" 
       ] 
      } 
      } 
     } 
    }, 
    "mappings": { 
    "videos": { 
     "properties": { 
      "fileName": { 
       "type": "string", 
       "analyzer": "autocomplete", 
       "search_analyzer": "standard" 
      }, 
      "path": { 
       "type": "string", 
       "index": "no" 
      } 
     } 
    } 
    } 
} 

现在,这是自动完成的设置和映射。

和查询的结构为:

{ 
    "query": { 
     "match": { 
      "fileName": "a" 
     } 
    }, 
    "highlight" : { 
     "fields" : { 
      "fileName" : {"force_source" : true} 
     } 
    } 
} 

我用亮点,这增加了用户的交互性。

+1

您似乎没有真正使用您定义的分析仪。您需要将它们设置为默认分析器,或者将它们设置为分析器或您的字段上的search_analyzer。 – Val

+0

@val雅,我的坏。在您的建议后更正它。多谢兄弟!! –

+1

好的,您是否在更改地图和添加分析器后重新编制索引数据?查询产生了什么? – Val

回答

1

您没有使用您定义的分析仪。您需要将它们设置为默认分析仪,或者在您的字段中将其设置为analyzersearch_analyzer

然后,您需要清除索引,重新创建索引并重新索引数据。

之后,你会得到你期望的结果。