获取有关Elasticsearch字段的建议

时间:2016-01-22 15:52:07

标签: elasticsearch

我正在尝试使用Elasticsearch建议功能。 遵循这篇文章https://qbox.io/blog/multi-field-partial-word-autocomplete-in-elasticsearch-using-ngrams

我现在的作品有效但不是同一句话中的两个单词。

我现在在ES中的数据是。

{
   "_index": "books",
   "_type": "book",
   "_id": "AVJp8p4ZTfM-Ee45GnF5",
   "_score": 1,
   "_source": {
      "title": "Making a dish",
      "author": "Jim haunter"
   }
},
{
   "_index": "books",
   "_type": "book",
   "_id": "AVJp8jaZTfM-Ee45GnF4",
   "_score": 1,
   "_source": {
       "title": "The big fish",
       "author": "Jane Stewart"
   }
},
{
   "_index": "books",
   "_type": "book",
   "_id": "AVJp8clRTfM-Ee45GnF3",
   "_score": 1,
   "_source": {
        "title": "The Hunter",
        "author": "Jame Franco"
    }
}

以下是映射和设置。

{"settings": {
  "analysis": {
     "filter": {
        "nGram_filter": {
           "type": "nGram",
           "min_gram": 2,
           "max_gram": 20,
           "token_chars": [
              "letter",
              "digit"
           ]
        }
     },
     "analyzer": {
        "nGram_analyzer": {
           "type": "custom",
           "tokenizer": "whitespace",
           "filter": [
              "lowercase",
              "nGram_filter"
           ]
        },
        "whitespace_analyzer": {
           "type": "custom",
           "tokenizer": "whitespace",
           "filter": [
              "lowercase"
           ]
        } 
     }
  }
},
"mappings": {
  "books": {
     "_all": {
        "index_analyzer": "nGram_analyzer",
        "search_analyzer": "whitespace_analyzer"
     },
     "properties": {
        "title": {
           "type": "string",
           "index": "no"
        },
        "author": {
           "type": "string",
           "index": "no"
        }
      }
    }
  }
}

这是搜索

{
   "size": 10,
   "query": {
   "match": {
   "_all": {
      "query": "Hunter",
      "operator": "and",
      "fuzziness": 1
   }
  }
 }
}

当我搜索“我”时   “大鱼”和   “猎人”。 但是,当我进入“狩猎”时,我什么都没得到。 为了再次获得这本书,我需要输入“The Hunte”。 有什么建议? 任何帮助表示赞赏。

1 个答案:

答案 0 :(得分:1)

从为我工作的字段中删除"index": "no"。此外,由于我使用的是ES 2.x,我不得不将“index_analyzer”替换为"analyzer"。所以这是映射:

PUT /test_index
{
   "settings": {
      "analysis": {
         "filter": {
            "nGram_filter": {
               "type": "nGram",
               "min_gram": 2,
               "max_gram": 20,
               "token_chars": [
                  "letter",
                  "digit"
               ]
            }
         },
         "analyzer": {
            "nGram_analyzer": {
               "type": "custom",
               "tokenizer": "whitespace",
               "filter": [
                  "lowercase",
                  "nGram_filter"
               ]
            },
            "whitespace_analyzer": {
               "type": "custom",
               "tokenizer": "whitespace",
               "filter": [
                  "lowercase"
               ]
            }
         }
      }
   },
   "mappings": {
      "books": {
         "_all": {
            "analyzer": "nGram_analyzer",
            "search_analyzer": "whitespace_analyzer"
         },
         "properties": {
            "title": {
               "type": "string"
            },
            "author": {
               "type": "string"
            }
         }
      }
   }
}

以下是我用来测试它的一些代码:

http://sense.qbox.io/gist/0140ee0f5043f66e76cc3109a18d573c1d09280b