elasticsearch - 具有变量值的 ElasticSearch 搜索结果
问题描述
我希望将 elasticsearch 用于具有自动完成功能的搜索栏。我有一组问题,它们有多个变量,我想用其他值代替。
一个问题的模板是:你喜欢FIELDS吗?将 FIELDS 替换为数学、物理、历史,然后在查询“你喜欢”这个问题时,它会显示多个命中:
- 你喜欢数学吗?
- 你喜欢物理吗?
- 你喜欢历史吗?
我将 elasticseach 视为同义词分析器,并认为它可以用于这个用例,但它似乎不像我预期的那样工作。以下是我到目前为止所拥有的。
创建索引
{
"mappings": {
"properties": {
"my_field": {
"type": "search_as_you_type",
"analyzer": "standard",
"search_analyzer": "synonym_analyzer"
}
}
},
"settings": {
"index": {
"analysis": {
"analyzer": {
"synonym_analyzer": {
"tokenizer": "whitespace",
"filter": ["my_synonyms"]
}
},
"filter": {
"my_synonyms": {
"type": "synonym",
"synonyms": [
"FIELDS => math, physics, history"
]
}
}
}
}
}
}
询问
{
"query": {
"multi_match": {
"query": partial_question,
"type": "bool_prefix",
"fields": [
"my_field",
"my_field._2gram",
"my_field._3gram",
"my_field._index_prefix"
]
}
}
}
结果是一个结果“你喜欢FIELDS吗?”
解决方案
@hansley 答案会起作用,但由于通配符查询成本很高,您可以简单地使用前缀查询而不更改索引中的任何内容。
尽管在 ES 中实现 Autosuggest 有多种方法,并且考虑到它的重要性和受欢迎程度,但我已经写了一篇关于各种方法及其权衡的详细博客,而且我的这个 SO 答案可以为您提供有关构建一个功能和非功能要求的信息自动建议功能。
使用前缀查询的端到端示例:
.keyword field
默认索引映射,它为每个文本字段创建一个:
索引示例文档:
{
"title" : "i like red car"
}
{
"title" : "do you like math?"
}
{
"title" : "do you like physics?"
}
搜索查询
{
"query": {
"prefix": {
"title.keyword": {
"value": "do you like"
}
}
}
}
搜索结果
"hits": [
{
"_index": "partialpre",
"_type": "_doc",
"_id": "1",
"_score": 1.0,
"_source": {
"title": "do you like math?"
}
},
{
"_index": "partialpre",
"_type": "_doc",
"_id": "2",
"_score": 1.0,
"_source": {
"title": "do you like physics?"
}
}
]
推荐阅读
- git - git:使用来自主错误的最新更改更新当前开发分支
- css - 使用动态 StyleClass 为 Primefaces 设置 CSS 的特异性
- dialogflow-es - Dialogflow 松弛集成被破坏了?
- python - Python 中的流体计算 - 可用选项
- python-3.x - 使用 lxml 解析 xml 时在标记中保留命名空间前缀
- sql - 使用日期列作为终止条件的递归 CTE 到 SUM 金额列
- codenameone - 代号一中的表情符号
- python - 如何找出进程挂起的位置/原因?
- kendo-grid - 如何格式化剑道网格组日期
- java - 请帮助我理解 JRuby 方法名称转换不一致