3

在 Elasticsearch 上工作,我的用例非常简单。当用户在搜索框中键入时,我想搜索我的所有数据集,而不考虑字段或列或任何条件(搜索所有数据并提供文档中所有出现的搜索词)。这可能在他们的文档中可用,但我无法理解。有人可以解释一下吗?

4

2 回答 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"
             ]
        }
    }
}
于 2017-04-10T12:10:49.147 回答
1

Query_string( link ) 可以为你完成这项工作。它有效地支持部分搜索,这是我的分析https://stackoverflow.com/a/43321606/2357869
Query_string 比 match、term 和 wildcard 查询更强大。

场景 1 - 假设你想搜索“你好”: -

然后去: -

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

它将搜索所有单词,如 ABCHello 、 HelloABC 、 ABCHEloABC

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

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

然后去: -

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

它将搜索所有单词,如 ABCHello 、 HelloABC 、 ABCHelloABC 、 ABCWorldABC 、ABChello 、ABCworldABC 等。

它会像 Hello OR World 一样搜索,所以无论哪个单词有 Hello Or world,它都会给出。

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

于 2017-04-10T12:13:08.053 回答