我正在寻找一个搜索栏与自动完成功能使用ElasticSearch。我有一组问题,它们有多个变量,我想用其他值来代替。
一个问题的模板是:你喜欢字段吗?将字段替换为数学、物理、历史,然后在查询问题“do you like”时,将显示多个点击:
你喜欢数学吗?
你喜欢物理吗?
你喜欢历史吗?
我将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"
]
}
}
}
结果是一个结果“你喜欢田地吗?”
3条答案
按热度按时间ryoqjall1#
如果我能很好地理解你的问题,我会给你一个建议性的答案。我使用通配符查询和规范化器来将所有值小写:
以下是我的索引Map:
我在索引中摄取了以下数据:
“quest”:“你喜欢数学吗?”
“探索”:“你喜欢物理吗?”
“探索”:“你喜欢历史吗?”
“探索”:“我想我确实喜欢你”
“quest”:“我喜欢红色的车”
“quest”:“你不喜欢”
“quest”:“你喜欢数学吗?”
基于这些值,我创建了以下查询:
答复是:
链接:https://www.elastic.co/guide/en/elasticsearch/reference/current/normalizer.htmlhttps://www.elastic.co/guide/en/elasticsearch/reference/current/query-dsl-wildcard-query.html
注意:但是,如果使用通配符,可能会影响性能
让我知道如果它能帮助你,否则我们可以在另一个解决方案工作谢谢你。
nsc4cvqm2#
我认为你用同义词看错了方向。你想要的是一个建议者。你将有一点具体的工作要做,但你将能够创建非常强大的建议,为您的用例。
iq0todco3#
@hansley answer可以工作,但由于通配符查询的成本很高,您可以简单地使用前缀查询,而无需更改索引中的任何内容。
尽管在es中实现autosuggest有多种方法,考虑到autosuggest的重要性和受欢迎程度,我已经写了一篇详细的博客,介绍了各种方法及其优缺点,我的这个答案可以为您提供有关构建autosuggest特性的功能性和非功能性需求的信息。
使用前缀查询的端到端示例:
默认索引Map,它创建
.keyword field
对于每个文本字段:索引示例文档:
搜索查询
搜索结果