具有可变值的ElasticSearch搜索结果

具有可变值的ElasticSearch搜索结果,
Warning: implode(): Invalid arguments passed in /data/phpspider/zhask/webroot/tpl/detail.html on line 45
,,我想用elasticsearch搜索一个具有自动完成功能的搜索栏。 我有一组问题,它们有多个变量,我想用其他值来代替 问题的模板是:您喜欢字段吗? 数学、物理、历史取代了这些领域 然后当查询问题“你喜欢吗”时,它会显示多个点击: 你喜欢数学吗 你喜欢物理吗 你喜欢历史吗 我将elasticseach视为同义词分析器,并认为它可以用于此用例,但它似乎不像我预期的那样工作。以下是我到目前为止的资料 创建索引 { "mappings": {

我想用elasticsearch搜索一个具有自动完成功能的搜索栏。 我有一组问题,它们有多个变量,我想用其他值来代替

问题的模板是:您喜欢字段吗? 数学、物理、历史取代了这些领域 然后当查询问题“你喜欢吗”时,它会显示多个点击:

  • 你喜欢数学吗
  • 你喜欢物理吗
  • 你喜欢历史吗
我将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"
                            ]
                        }
                    }
                }
            }
        }
    }
质疑


结果是一个结果“你喜欢字段吗?”

我认为你用同义词看错了方向。 你想要的是一个。
您将有一些具体的工作要做,但您将能够为您的用例创建非常强大的建议。

如果我很好地理解了您的问题,我将为您提供一个建议答案,您可以使用。我使用通配符查询和规范化器将所有值小写:

以下是我的索引的映射:

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?"
        }
      }
    ]