2015-04-20 45 views
7

使用Elasticsearch完成建议程序我在返回与单字查询匹配的多字输入建议时遇到问题。Elasticsearch完成建议使用多字输入进行搜索

实施例结构:

PUT /test_index/ 
{ 
    "mappings": { 
     "item": { 
     "properties": { 
      "test_suggest": { 
       "type": "completion", 
       "index_analyzer": "whitespace", 
       "search_analyzer": "whitespace", 
       "payloads": false 
      } 
     } 
     } 
    } 
} 

PUT /test_index/item/1 
{ 
    "test_suggest": { 
     "input": [ 
     "cat dog", 
     "elephant" 
     ] 
    } 
} 

工作查询:

POST /test_index/_suggest 
{ 
    "test_suggest":{ 
     "text":"cat", 
     "completion": { 
      "field" : "test_suggest" 
     } 
    } 
} 

与结果

{ 
    "_shards": { 
     "total": 5, 
     "successful": 5, 
     "failed": 0 
    }, 
    "test_suggest": [ 
     { 
     "text": "cat", 
     "offset": 0, 
     "length": 3, 
     "options": [ 
      { 
       "text": "cat dog", 
       "score": 1 
      } 
     ] 
     } 
    ] 
} 

失败查询:

POST /test_index/_suggest 
{ 
    "test_suggest":{ 
     "text":"dog", 
     "completion": { 
      "field" : "test_suggest" 
     } 
    } 
} 

与结果

{ 
    "_shards": { 
     "total": 5, 
     "successful": 5, 
     "failed": 0 
    }, 
    "test_suggest": [ 
     { 
     "text": "dog", 
     "offset": 0, 
     "length": 3, 
     "options": [] 
     } 
    ] 
} 

我希望同样的结果作为工作的查询,匹配“猫狗”。任何建议是什么问题以及如何使失败的查询工作?当使用标准分析仪代替空白分析仪时,我会得到相同的结果。我想在上面的例子中给每个输入字符串使用多个单词。

回答

10

完成建议程序是prefix suggester,这意味着它会尝试将您的查询与输入的前几个字符进行匹配。如果您想要发布的文档与文本“dog”匹配,那么您需要指定“dog”作为输入。

PUT /test_index/item/1 
{ 
    "test_suggest": { 
     "input": [ 
     "cat dog", 
     "elephant", 
     "dog" 
     ] 
    } 
} 

以我的经验,不必指定输入相匹配的限制使得完成suggesters不太有用其他方法来实现的前缀匹配。为此,我喜欢edge ngrams。我最近写了一篇博客文章中使用的n-gram,你可能会发现有用:http://blog.qbox.io/an-introduction-to-ngrams-in-elasticsearch

作为一个简单的例子,这里是一个映射,您可以使用

PUT /test_index 
{ 
    "settings": { 
     "analysis": { 
     "filter": { 
      "edge_ngram_filter": { 
       "type": "edge_ngram", 
       "min_gram": 2, 
       "max_gram": 20 
      } 
     }, 
     "analyzer": { 
      "edge_ngram_analyzer": { 
       "type": "custom", 
       "tokenizer": "standard", 
       "filter": [ 
        "lowercase", 
        "edge_ngram_filter" 
       ] 
      } 
     } 
     } 
    }, 
    "mappings": { 
     "item": { 
     "properties": { 
      "text_field": { 
       "type": "string", 
       "index_analyzer": "edge_ngram_analyzer", 
       "search_analyzer": "standard" 
      } 
     } 
     } 
    } 
} 

那么指数的文档是这样的:

PUT /test_index/item/1 
{ 
    "text_field": [ 
     "cat dog", 
     "elephant" 
    ] 
} 

和这些查询将返回它:

POST /test_index/_search 
{ 
    "query": { 
     "match": { 
      "text_field": "dog" 
     } 
    } 
} 

POST /test_index/_search 
{ 
    "query": { 
     "match": { 
      "text_field": "ele" 
     } 
    } 
} 

POST /test_index/_search 
{ 
    "query": { 
     "match": { 
      "text_field": "ca" 
     } 
    } 
} 

她E公司代码一起:

http://sense.qbox.io/gist/4a08fbb6e42c34ff8904badfaaeecc01139f96cf

+2

搜索+查询不返回文本和我的情况下,文本可以是三个字段中的任何东西,所以我怎么能显示自动完成确切的文本。 –

相关问题