elasticsearch - Elasticsearch 中的自动完成

标签 elasticsearch autocomplete elasticsearch-5 kibana-5

我计划为电子商务网站制作一个基于 Elasticsearch 的自动完成模块。我正在使用 edge_ngram 提供建议。我正在尝试这种配置。

**My index creation :**

PUT my_index
{
  "settings": {
    "analysis": {
      "analyzer": {
        "autocomplete": {
          "tokenizer": "autocomplete",
          "filter": [
            "lowercase"
          ]
        },
        "autocomplete_search": {
          "tokenizer": "lowercase"
        }
      },
      "tokenizer": {
        "autocomplete": {
          "type": "edge_ngram",
          "min_gram": 1,
          "max_gram": 10,
          "token_chars": [
            "letter","digit"
          ]
        }
      }
    }
  },
  "mappings": {
    "doc": {
      "properties": {
        "title": {
          "type": "text",
          "analyzer": "autocomplete",
          "search_analyzer": "autocomplete_search"
        }
      }
    }
  }
}

**Inserting Data**

PUT my_index/doc/1
{
  "title": "iphone s" 
}

PUT my_index/doc/9
{
  "title": "iphone ka" 
}

PUT my_index/doc/11
{
  "title": "iphone ka t" 
}

PUT my_index/doc/15
{
  "title": "iphone 6" 
}

PUT my_index/doc/14
{
  "title": "iphone 6 16GB" 
}

PUT my_index/doc/3
{
  "title": "iphone k" 
}

POST my_index/_refresh

POST my_index/_analyze
{
  "tokenizer": "autocomplete",
  "text": "iphone 6"
}

POST my_index/_analyze
{
  "analyzer": "pattern",
  "text": "iphone 6"
}

**Autocomplete suggestions**
When i am trying to find out closets match to iphone 6.It is not showing correct result.

GET my_index/_search
{
  "query": {
    "match": {
      "title": {
        "query": "iphone 6", 
        "operator": "and"
      }
    }
  }
}


**Above query yielding :**
{
  "took": 0,
  "timed_out": false,
  "_shards": {
    "total": 5,
    "successful": 5,
    "failed": 0
  },
  "hits": {
    "total": 7,
    "max_score": 0.28582606,
    "hits": [
      {
        "_index": "my_index",
        "_type": "doc",
        "_id": "1",
        "_score": 0.28582606,
        "_source": {
          "title": "iphone s"
        }
      },
      {
        "_index": "my_index",
        "_type": "doc",
        "_id": "9",
        "_score": 0.25811607,
        "_source": {
          "title": "iphone ka"
        }
      },
      {
        "_index": "my_index",
        "_type": "doc",
        "_id": "14",
        "_score": 0.24257512,
        "_source": {
          "title": "iphone 6 16GB"
        }
      },
      {
        "_index": "my_index",
        "_type": "doc",
        "_id": "3",
        "_score": 0.19100356,
        "_source": {
          "title": "iphone k"
        }
      },
      {
        "_index": "my_index",
        "_type": "doc",
        "_id": "15",
        "_score": 0.1862728,
        "_source": {
          "title": "iphone 6"
        }
      },
      {
        "_index": "my_index",
        "_type": "doc",
        "_id": "11",
        "_score": 0.16358379,
        "_source": {
          "title": "iphone ka t"
        }
      },
      {
        "_index": "my_index",
        "_type": "doc",
        "_id": "2",
        "_score": 0.15861572,
        "_source": {
          "title": "iphone 5 s"
        }
      }
    ]
  }
}

但结果应该是:
     {
        "_index": "my_index",
        "_type": "doc",
        "_id": "15",
        "_score": 1,
        "_source": {
          "title": "iphone 6"
        }
      }

如果我在这方面遗漏了什么,请告诉我,我是新手,所以不知道任何其他可能产生更好结果的方法。

最佳答案

您正在使用 autocomplete_search作为您的search_analyzer .如果您查看如何使用您指定的搜索分析器分析您的文本。

POST my_index/_analyze
{
 "analyzer": "autocomplete_search",
 "text": "iphone 6"
}

你会得到
 {
 "tokens": [
  {
     "token": "iphone",           ===> Only one token
     "start_offset": 0,
     "end_offset": 6,
     "type": "word",
     "position": 0
     }
   ]
 }

由于所有文档在 iphone 中都有这个 (reverse index) 标记.所以所有的文件都被退回

如果您想匹配所需的结果,您可以使用索引时使用的相同分析器。
{
 "query": {
 "match": {
  "title": {
    "query": "iphone 6", 
    "operator": "and",
    "analyzer" : "autocomplete"
   }
  } 
 }
}

关于elasticsearch - Elasticsearch 中的自动完成,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43912342/

相关文章:

c# - NEST:创建别名并设置过滤器

Elasticsearch 查询在预期 > 10,000 时返回 10

ruby - 为 .API 文件启用自动完成?

javascript - 使用 AutoSuggest jQuery 插件动态传递数据中的数据对象

JavaFX TextField 自动建议

java - 哪个客户端可以在 Java 1.6 中运行并从 Elasticsearch 5.4 进行查询?

elasticsearch - 结合索引模板和动态模板

python - “没有为[过滤]注册[查询]”

lucene - ElasticSearch 索引大小减小,而 docs.count 增加

python - 在 Python 中编写 Elasticsearch 身份验证