ElasticSearch:如何在一个或多个索引中跨所有类型搜索任意字段中的值?

b5lpy0ml  于 2022-12-03  发布在  ElasticSearch
关注(0)|答案(6)|浏览(154)

我有两个索引my_index_1my_index_2。在这些索引中,我有以下文档类型:
my_index_1

  • 人员
  • 组织机构
  • 角色
  • 技能

my_index_2

  • 产品
  • 服务
  • 专利
  • 商标
  • 服务标记

每种类型都有不同的字段。

**我的问题:**在任何类型的任何字段中,跨任何一个索引甚至两个索引查询字符串“abc”的最佳方法是什么?

我在文档中没有看到任何有助于此类搜索的内容。是否有类似以下内容:

$ curl -XPOST 'localhost:9200/_search?pretty' -d '
{
  "query": { "match": { *: "abc" } }
}'

提前感谢你能提供的任何帮助。

yv5phkfx

yv5phkfx1#

query_string querymatch query将是您正在寻找的。
如果在default_field中没有指定,query_string将使用特殊的_all field,这样会很好地工作。

curl -XPOST 'localhost:9200/_search?pretty' -d '{
  "query": { "query_string": { "query": "abc" } }
}'

对于match,您也可以指定_all

curl -XPOST 'localhost:9200/_search?pretty' -d '{
  "query": { "match": { "_all": "abc" } }
}'

请注意,对于query_string,您可以使用通配符,而对于match,则不能使用通配符

更新日期:

由于6.0中不赞成使用_all字段,因此现在的解决方案是实现自定义all字段

c0vxltue

c0vxltue2#

multi match query字段是现已弃用的_all字段的替代字段

GET /_search
{
  "query": {
    "multi_match" : {
      "query":    "Will Smith",
      "fields": [ "important_field^5", "less_important^2", "title", "*_name" ] 
    }
  }
}

请注意,支持在字段名称中使用通配符,也支持使用^#语法提高字段的重要性
从版本7.3开始:如果未提供任何字段,则multi_match查询会预设为index.query.default_field索引设定,而索引设定又会预设为 *. *,会撷取对映中符合字词查询条件的所有字段,并筛选中继数据字段。然后会组合所有撷取的字段以建立查询。
另一种替代方案是Query string query

GET /_search
{
    "query": {
        "query_string" : {
            "query" : "(new york city) OR (big apple)",
            "default_field" : "content"
        }
    }
}

default_field(可选,字符串)查询字符串中未提供字段时要搜索的默认字段。
预设为index.query.default_field索引设定,其预设值为 *。

1hdlvixo

1hdlvixo3#

我认为可以使用_all来实现此目的
试试这个

$ curl -XPOST 'localhost:9200/_search?pretty' -d '
{
  "query": { "match": { "_all": "abc" } }
}'

您也可以使用query_string,因为它会依预设搜寻_all

oewdyzsn

oewdyzsn4#

尝试以下操作以获取所有索引和所有字段的结果:

GET _all/_search
{
"query" : {
   "multi_match": {
      "query": "abc",
      "fields": []
       }
    }
 }
qcbq4gxm

qcbq4gxm5#

我使用的是8.3版的Elasticsearch,这些都不适合我。
工作了我:

public function search($text)
{

    $client = $this->setClient();

    $params   = $this->transferRequiredFormat($text);
    $response = $client->search($params, $info = false);

    printf("Total docs: %d\n", $response['hits']['total']['value']);
    printf("Max score : %.4f\n", $response['hits']['max_score']);
    printf("Took      : %d ms\n", $response['took']);
    dd($response['hits']['hits']);

}

private function setClient()
{
    return ClientBuilder::create()->setHosts(['localhost:9200'])->build();
}

protected function transferRequiredFormat($text): array
{
    return [
        'index' => self::INDEX_NAME,
        'body'  => [
            'query' => [
                'query_string' => [
                    'query' => $text,
                ],
            ],
        ],
    ];
}

或简短的调查文档

curl -X GET "localhost:9200/_search?pretty" -H 'Content-Type: application/json' -d'
{
  "query": {
    "query_string": {
      "query": "(new york city) OR (big apple)",
      "default_field": "content"
    }
  }
}
puruo6ea

puruo6ea6#

$params = [
        'index' => 'my_index1,my_index2',
        'from'=>0,
        'size'=>10,
        'body'  => [
            'query' => [
                'bool' => [
                    'filter' => [
                        [
                            'query_string' => [
                                'query' => "info*"
                                //'query' => "*info*"
                            ]
                        ]
                    ]
                ]
            ]
        ]
    ];

相关问题