簡體   English   中英

python elasticsearch:如何在所有字段上查詢字符串

[英]python elasticsearch: how to query a string on all fields

我有以下運行良好的python代碼,為我帶來了50個預期的結果:

elastic = settings.ELASTIC
indexes = u'nginx-access-2769z-2018.11.26.16'
filter_by_client = [
    {'match_phrase': {'client_id': '2769z'}},
]
range_for_search = {
    'gte': str(1543248611),
    'lte': str(1543249511),
    'format': 'epoch_second',
}
query_body = {
    'from': 0,
    'size': 50,
    'query': {
        'bool': {
            'must': filter_by_client,
            'filter': {'range': {'@timestamp': range_for_search}},
        },
    }
}
search_result = elastic.search(index=indexes, body=query_body)
results = [result['_source'] for result in search_result['hits']['hits']]

現在,如果我添加另一個過濾器,例如

...
filter_by_client = [
    {'match_phrase': {'client_id': '2769z'}},
    {'match': {'remote_address': '181.220.174.189'}}
]
...

它也可以正常工作! 將其縮小到5個結果。

我的問題是:如何在所有字段中查詢該字符串? 對我來說沒關系,如果該字符串位於字段的開頭/結尾,是否為大寫字母,如果該字段實際上是整數/浮點數而不是字符串,...

已經嘗試使用“ _all”這樣的關鍵字

...
filter_by_client = [
    {'match_phrase': {'client_id': '2769z'}},
    {'match': {'_all': '181.220.174.189'}}
]
...

但它給我0個結果。 嘗試重現通過Kibana界面發生的相同行為。

Nishant提到的是使用copy_to字段的最佳解決方案,但是,如果您沒有更改映射的控件,則可以嘗試查看以下任何一種方法是否有幫助。

使用查詢字符串查詢

您可以使用查詢字符串查詢 ,查詢方式如下:

...
filter_by_client = [
    {'match_phrase': {'client_id': '2769z'}},
    {'query_string': {'query': '181.220.174.189'}}
]
... 

一個重要的注意事項是query_string默認搜索所有字段。 我提到的鏈接說明如下:

如果未指定前綴字段,則為查詢詞的默認字段。 默認為index.query.default_field索引設置,而默認為*。 *提取映射中符合詞條查詢條件的所有字段,並過濾元數據字段。

我也提到這一點是因為我希望您在決定使用query_string之前先了解使用query_string與簡單匹配Match與Query-String的區別。

匹配項查詢不經過“查詢解析”過程。 它不支持字段名稱前綴,通配符或其他“高級”功能。 因此,失敗的可能性很小/根本不存在,並且在將文本作為查詢行為進行分析和運行時,它提供了出色的行為(通常是文本搜索框所做的事情)。 另外,短語_前綴類型可以提供出色的“鍵入時”行為,以自動加載搜索結果。

使用多重比對

下面是另一個可能的解決方案,如果您不想更改映射,則使用多重匹配查詢

...
filter_by_client = [
    {'match_phrase': {'client_id': '2769z'}},
    {'multi_match': {'query': '181.220.174.189', 'fields': ['url', 'field_2']}}
]
...

了解如何在查詢時明確提及要考慮的字段。 但是請確保您徹底驗證/測試它。

讓我知道這是否有幫助!

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM