弹性搜索中的全局搜索

3

我正在使用Elasticsearch,我的用例非常简单。当用户在搜索框中输入内容时,我希望能够搜索我的所有数据集,无论字段、列或任何条件(搜索所有数据并提供文档中所有搜索词的出现情况)。

这可能在他们的文档中有说明,但我无法理解。有人可以解释一下吗?

2个回答

5
使用_all字段是搜索索引中所有字段的最简单方法。
_all字段是一个万能字段,它将所有其他字段的值连接成一个大字符串,使用空格作为分隔符进行分析和索引,但不存储。
例如:
PUT my_index/user/1 
{
  "first_name":    "John",
  "last_name":     "Smith",
  "date_of_birth": "1970-10-24"
}

GET my_index/_search
{
  "query": {
    "match": {
      "_all": "john smith 1970"
    }
  }
}

支持高亮显示,因此匹配的出现可以在搜索结果中返回。

缺点

这种方法有两个主要缺点:

  1. 需要额外的磁盘空间和内存来存储_all字段
  2. 您失去了数据和搜索术语分析的灵活性

更好的方法是禁用_all字段,而是列出您感兴趣的字段:

GET /_search
{
    "query": {
        "query_string" : {
            "query" : "this AND that OR thus",
            "fields":[
                "name",
                "addressline1",
                "dob",
                "telephone",
                "country",
                "zipcode"
             ]
        }
    }
}

2

Query_string (链接) 可以帮助您完成这项任务。它可以有效地支持部分搜索,以下是我的分析 https://dev59.com/Fl8e5IYBdhLWcg3wLYDs#43321606
Query_string 比 match、term 和 wildcard 查询更强大。

场景 1 - 假设您想搜索 "Hello":

那么请使用:

{
  "query": {
    "query_string": {"query": "*Hello*" }
  }
}

它将搜索所有类似于ABCHello,HelloABC,ABCHeloABC的单词

默认情况下,它将在所有字段(_all)中搜索hello

2)场景2-假设您想搜索“Hello”或“World”:

然后使用:

{
  "query": {
    "query_string": {"query": "*Hello* *World*" }
  }
}

它将搜索所有类似于ABCHello,HelloABC,ABCHelloABC,ABCWorldABC,ABChello,ABCworldABC等单词。

它将像Hello或World一样搜索,因此任何包含Hello或world的单词都会给出结果。

默认情况下,query_string(link)使用默认运算符OR,您可以更改它。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接