具有可变值的ElasticSearch搜索结果
我想用elasticsearch搜索一个具有自动完成功能的搜索栏。 我有一组问题,它们有多个变量,我想用其他值来代替 问题的模板是:您喜欢字段吗? 数学、物理、历史取代了这些领域 然后当查询问题“你喜欢吗”时,它会显示多个点击:具有可变值的ElasticSearch搜索结果,
Warning: implode(): Invalid arguments passed in /data/phpspider/zhask/webroot/tpl/detail.html on line 45
,,我想用elasticsearch搜索一个具有自动完成功能的搜索栏。 我有一组问题,它们有多个变量,我想用其他值来代替 问题的模板是:您喜欢字段吗? 数学、物理、历史取代了这些领域 然后当查询问题“你喜欢吗”时,它会显示多个点击: 你喜欢数学吗 你喜欢物理吗 你喜欢历史吗 我将elasticseach视为同义词分析器,并认为它可以用于此用例,但它似乎不像我预期的那样工作。以下是我到目前为止的资料 创建索引 { "mappings": {
- 你喜欢数学吗
- 你喜欢物理吗
- 你喜欢历史吗
{
"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"
]
}
}
}
}
}
}
质疑
结果是一个结果“你喜欢字段吗?”我认为你用同义词看错了方向。 你想要的是一个。
您将有一些具体的工作要做,但您将能够为您的用例创建非常强大的建议。如果我很好地理解了您的问题,我将为您提供一个建议答案,您可以使用。我使用通配符查询和规范化器将所有值小写: 以下是我的索引的映射:
PUT multiple-fields
{
"settings": {
"analysis": {
"normalizer": {
"lowercase_normalizer": {
"type":"custom",
"filter": ["lowercase"]
}
}
}
},
"mappings": {
"properties": {
"quest":{
"type": "keyword",
"normalizer": "lowercase_normalizer"
}
}
}
}
我在索引中摄取了以下数据:
“探索”:“你喜欢数学吗?”
“探索”:“你喜欢物理吗?”
“探索”:“你喜欢历史吗?”
“探索”:“我想我确实喜欢你”
“任务”:“我喜欢红色汽车”
“任务”:“你不喜欢吗?”
“探索”:“你喜欢数学吗?”
基于这些值,我创建了以下查询:
GET multiple-fields/_search
{
"query": {
"wildcard": {
"quest": {
"value": "do you like*"
}
}
}
}
答复是:
"hits" : [
{
"_index" : "multiple-fields",
"_type" : "_doc",
"_id" : "bue1e3QBsTCl1BZvB0by",
"_score" : 1.0,
"_source" : {
"quest" : "do you like math?"
}
},
{
"_index" : "multiple-fields",
"_type" : "_doc",
"_id" : "cOe1e3QBsTCl1BZvD0Yh",
"_score" : 1.0,
"_source" : {
"quest" : "do you like physics?"
}
},
{
"_index" : "multiple-fields",
"_type" : "_doc",
"_id" : "cee1e3QBsTCl1BZvE0Zq",
"_score" : 1.0,
"_source" : {
"quest" : "do you like history?"
}
},
{
"_index" : "multiple-fields",
"_type" : "_doc",
"_id" : "2-e1e3QBsTCl1BZvLUak",
"_score" : 1.0,
"_source" : {
"quest" : "Do you like math?"
}
}
]
链接:
注意:但是,如果使用通配符,可能会影响性能
让我知道它是否对您有帮助,否则我们可以研究另一个解决方案谢谢。@hansley answer也可以,但由于通配符查询的成本很高,您只需使用,而无需更改索引中的任何内容 尽管在ES中实现Autosuggest的方法多种多样,考虑到它的重要性和流行性,我已经写了一篇文章,我也可以为您提供有关构建Autosuggest功能的功能性和非功能性需求的信息 使用前缀查询的端到端示例: 默认索引映射,为每个文本字段创建一个
。关键字字段
:
索引示例文档:
{
"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?"
}
}
]
有没有可能有一个你想要的输出的例子?我有些困惑要理解。如果我很好地理解了你的问题,如果你搜索一个特定的值,它应该返回“你喜欢数学吗?”以及其他点击[Physic and history]是的,所需的输出是“你喜欢数学吗?”?你喜欢物理吗?你喜欢历史吗?当我的
部分问题是“你喜欢吗”@Ffloriel时,请看一下我的答案,如果你有后续相关问题,请告诉我,如我的答案所示,它解决了问题中的问题:)@Ffloriel如果你有后续问题,请告诉我,否则,如果有帮助,请投票并接受答案,提前感谢:)@Ffloriel遗憾的是,赏金也结束了,您没有获得全额赏金,也没有提出后续问题并接受任何答案,希望您一切顺利,请在可以的时候回复。
"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?"
}
}
]