Hier werden die Unterschiede zwischen zwei Versionen angezeigt.
Beide Seiten der vorigen Revision Vorhergehende Überarbeitung Nächste Überarbeitung | Vorhergehende Überarbeitung | ||
elasticsearch [2025/03/27 11:10] jango [Query Builder] |
elasticsearch [2025/04/16 14:47] (aktuell) jango |
||
---|---|---|---|
Zeile 1: | Zeile 1: | ||
[[https:// | [[https:// | ||
- | Siehe auch [[OpenSearch]] | + | Siehe auch [[OpenSearch]], [[Wazuh]] |
+ | |||
+ | < | ||
+ | { | ||
+ | " | ||
+ | " | ||
+ | }, | ||
+ | " | ||
+ | } | ||
+ | </ | ||
+ | |||
+ | < | ||
+ | #Delete datastream | ||
+ | curl -X DELETE " | ||
+ | |||
+ | # find all agents | ||
+ | # windows | ||
+ | curl -X GET " | ||
+ | # linux | ||
+ | curl -X GET " | ||
+ | </ | ||
[[https:// | [[https:// | ||
+ | |||
+ | =====Service===== | ||
+ | |||
+ | Als Service einrichten: Im Ordner elasticsearch/ | ||
+ | < | ||
+ | elasticsearch-service.bat install | ||
+ | elasticsearch-service.bat start | ||
+ | elasticsearch-service.bat stop | ||
+ | elasticsearch-service.bat remove | ||
+ | </ | ||
=====Shards===== | =====Shards===== | ||
Zeile 26: | Zeile 56: | ||
=====Datatypes===== | =====Datatypes===== | ||
- | * **Text**: Wird für Volltextsuche verwendet. Inhalte werden analysiert (z. B. in Tokens zerlegt) und in einem inversen Index gespeichert. Ideal für große, durchsuchbare Textblöcke (z. B. Artikel oder Beschreibungen). | + | * **Text**: Wird für Volltextsuche verwendet. Inhalte werden analysiert (z. B. in Tokens zerlegt) und in einem inversen Index gespeichert. Ideal für große, durchsuchbare Textblöcke (z. B. Artikel oder Beschreibungen). |
- | * **Keyword**: | + | * **Keyword**: |
* **Integer**, | * **Integer**, | ||
* **Float**, **Double**: Gleitkommazahlen für präzise numerische Berechnungen. | * **Float**, **Double**: Gleitkommazahlen für präzise numerische Berechnungen. | ||
Zeile 134: | Zeile 164: | ||
=====Python===== | =====Python===== | ||
- | ====Query==== | + | ====Scroll |
<code python> | <code python> | ||
from elasticsearch import Elasticsearch | from elasticsearch import Elasticsearch | ||
Zeile 270: | Zeile 300: | ||
</ | </ | ||
+ | ====Query Builder Module==== | ||
+ | |||
+ | <code python> | ||
+ | import json | ||
+ | |||
+ | class ElasticsearchQueryBuilder: | ||
+ | def __init__(self): | ||
+ | self.query = { | ||
+ | " | ||
+ | " | ||
+ | " | ||
+ | " | ||
+ | " | ||
+ | } | ||
+ | } | ||
+ | } | ||
+ | |||
+ | def add_condition(self, | ||
+ | """ | ||
+ | Add a condition to the query. | ||
+ | The method is one of: ' | ||
+ | """ | ||
+ | if method == " | ||
+ | return {" | ||
+ | elif method == " | ||
+ | return {" | ||
+ | elif method == " | ||
+ | return {" | ||
+ | elif method == " | ||
+ | return {" | ||
+ | else: | ||
+ | raise ValueError(f" | ||
+ | |||
+ | def build_query(self, | ||
+ | """ | ||
+ | Build the query with the provided conditions, logical operator, and optional sorting. | ||
+ | ' | ||
+ | """ | ||
+ | if operator == " | ||
+ | self.query[" | ||
+ | elif operator == " | ||
+ | self.query[" | ||
+ | self.query[" | ||
+ | else: | ||
+ | raise ValueError(" | ||
+ | |||
+ | # Füge die Sortierung hinzu, falls ein Sortierfeld angegeben wurde | ||
+ | if sort_field: | ||
+ | self.query[" | ||
+ | |||
+ | return self.query | ||
+ | |||
+ | def display_query(self): | ||
+ | """ | ||
+ | print(json.dumps(self.query, | ||
+ | |||
+ | def add_nested_condition(self, | ||
+ | """ | ||
+ | Add a nested condition, creating a bool query within another bool query. | ||
+ | """ | ||
+ | nested_condition = { | ||
+ | " | ||
+ | " | ||
+ | } | ||
+ | } | ||
+ | return nested_condition | ||
+ | </ | ||
+ | |||
+ | Usage: | ||
+ | |||
+ | <code python> | ||
+ | from elasticsearch_query_builder import ElasticsearchQueryBuilder | ||
+ | |||
+ | # Initialisierung des Query Builders | ||
+ | builder = ElasticsearchQueryBuilder() | ||
+ | |||
+ | # Verschachtelte Bedingungen erstellen | ||
+ | must_conditions = [] | ||
+ | must_conditions.append(builder.add_condition(" | ||
+ | must_conditions.append(builder.add_condition(" | ||
+ | |||
+ | # Eine verschachtelte " | ||
+ | nested_condition = builder.add_nested_condition(" | ||
+ | must_conditions.append(nested_condition) | ||
+ | |||
+ | # Die Bedingungen zur Query hinzufügen (Operator AND) | ||
+ | query = builder.build_query(must_conditions, | ||
+ | |||
+ | # Die erzeugte Query ausgeben | ||
+ | builder.display_query() | ||
+ | </ | ||
+ | |||
+ | <code python> | ||
+ | # Initialisierung des Query Builders | ||
+ | builder = ElasticsearchQueryBuilder() | ||
+ | |||
+ | # Verschachtelte Bedingungen erstellen | ||
+ | must_conditions = [] | ||
+ | must_conditions.append(builder.add_condition(" | ||
+ | must_conditions.append(builder.add_condition(" | ||
+ | |||
+ | # Erste verschachtelte Bedingung | ||
+ | nested_condition_1 = builder.add_nested_condition(" | ||
+ | |||
+ | # Zweite verschachtelte Bedingung | ||
+ | nested_condition_2 = builder.add_nested_condition(" | ||
+ | |||
+ | # Die verschachtelten Bedingungen zur Liste der " | ||
+ | must_conditions.append(nested_condition_1) | ||
+ | must_conditions.append(nested_condition_2) | ||
+ | |||
+ | # Die Bedingungen zur Query hinzufügen (Operator AND) | ||
+ | query = builder.build_query(must_conditions, | ||
+ | |||
+ | # Die erzeugte Query ausgeben | ||
+ | builder.display_query() | ||
+ | </ | ||
+ | |||
+ | <code python> | ||
+ | # Initialisierung des Query Builders | ||
+ | builder = ElasticsearchQueryBuilder() | ||
+ | |||
+ | # Verschachtelte Bedingungen erstellen | ||
+ | must_conditions = [] | ||
+ | must_conditions.append(builder.add_condition(" | ||
+ | must_conditions.append(builder.add_condition(" | ||
+ | |||
+ | # Erste verschachtelte Bedingung mit zwei " | ||
+ | nested_condition_1 = { | ||
+ | " | ||
+ | " | ||
+ | builder.add_condition(" | ||
+ | builder.add_condition(" | ||
+ | ], | ||
+ | " | ||
+ | } | ||
+ | } | ||
+ | |||
+ | # Zweite verschachtelte Bedingung mit zwei " | ||
+ | nested_condition_2 = { | ||
+ | " | ||
+ | " | ||
+ | builder.add_condition(" | ||
+ | builder.add_condition(" | ||
+ | ], | ||
+ | " | ||
+ | } | ||
+ | } | ||
+ | |||
+ | # Die verschachtelten Bedingungen zur Liste der " | ||
+ | should_conditions = [] | ||
+ | should_conditions.append(nested_condition_1) | ||
+ | should_conditions.append(nested_condition_2) | ||
+ | |||
+ | # Die " | ||
+ | query = builder.build_query(must_conditions, | ||
+ | |||
+ | # Füge die " | ||
+ | query[" | ||
+ | |||
+ | # Die erzeugte Query ausgeben | ||
+ | builder.display_query() | ||
+ | </ | ||
=====Bash===== | =====Bash===== | ||
+ | ====Scroll Query==== | ||
+ | <code bash> | ||
+ | #!/bin/bash | ||
+ | |||
+ | # Elasticsearch-Server-URL | ||
+ | ES_HOST=" | ||
+ | INDEX=" | ||
+ | USER=" | ||
+ | PASS=" | ||
+ | |||
+ | # Erste Suchanfrage mit Scroll | ||
+ | response=$(curl -X POST " | ||
+ | " | ||
+ | " | ||
+ | " | ||
+ | } | ||
+ | }' --insecure) | ||
+ | |||
+ | # Scroll-ID extrahieren | ||
+ | scroll_id=$(echo " | ||
+ | |||
+ | # Anzahl der Treffer zählen | ||
+ | res_c=0 | ||
+ | |||
+ | # Loop über die Ergebnisse | ||
+ | while true; do | ||
+ | |||
+ | read -p "Press enter to continue" | ||
+ | |||
+ | # Treffer verarbeiten | ||
+ | hits=$(echo " | ||
+ | |||
+ | # Wenn keine Treffer mehr vorhanden sind, abbrechen | ||
+ | if [[ -z " | ||
+ | break | ||
+ | fi | ||
+ | |||
+ | # Treffer ausgeben | ||
+ | echo " | ||
+ | # | ||
+ | echo $hit |jq | ||
+ | ((res_c++)) | ||
+ | done | ||
+ | |||
+ | # Nächste Scroll-Anfrage senden | ||
+ | response=$(curl -X POST " | ||
+ | \" | ||
+ | \" | ||
+ | }" --insecure) | ||
+ | |||
+ | # Neuen Scroll-ID extrahieren | ||
+ | scroll_id=$(echo " | ||
+ | done | ||
+ | |||
+ | # Scroll-Context aufräumen | ||
+ | curl -s -X DELETE " | ||
+ | \" | ||
+ | }" > /dev/null | ||
+ | |||
+ | echo "We had $res_c results" | ||
+ | </ | ||
====Query Builder==== | ====Query Builder==== | ||
Zeile 366: | Zeile 620: | ||
</ | </ | ||
- | =====Bash mit Scroll===== | ||
- | <code bash> | ||
- | #!/bin/bash | ||
- | # Elasticsearch-Server-URL | ||
- | ES_HOST=" | ||
- | INDEX=" | ||
- | USER=" | ||
- | PASS=" | ||
- | |||
- | # Erste Suchanfrage mit Scroll | ||
- | response=$(curl -X POST " | ||
- | " | ||
- | " | ||
- | " | ||
- | } | ||
- | }' --insecure) | ||
- | |||
- | # Scroll-ID extrahieren | ||
- | scroll_id=$(echo " | ||
- | |||
- | # Anzahl der Treffer zählen | ||
- | res_c=0 | ||
- | |||
- | # Loop über die Ergebnisse | ||
- | while true; do | ||
- | |||
- | read -p "Press enter to continue" | ||
- | |||
- | # Treffer verarbeiten | ||
- | hits=$(echo " | ||
- | |||
- | # Wenn keine Treffer mehr vorhanden sind, abbrechen | ||
- | if [[ -z " | ||
- | break | ||
- | fi | ||
- | |||
- | # Treffer ausgeben | ||
- | echo " | ||
- | # | ||
- | echo $hit |jq | ||
- | ((res_c++)) | ||
- | done | ||
- | |||
- | # Nächste Scroll-Anfrage senden | ||
- | response=$(curl -X POST " | ||
- | \" | ||
- | \" | ||
- | }" --insecure) | ||
- | |||
- | # Neuen Scroll-ID extrahieren | ||
- | scroll_id=$(echo " | ||
- | done | ||
- | |||
- | # Scroll-Context aufräumen | ||
- | curl -s -X DELETE " | ||
- | \" | ||
- | }" > /dev/null | ||
- | |||
- | echo "We had $res_c results" | ||
- | </ | ||
=====Links===== | =====Links===== | ||
* [[https:// | * [[https:// | ||
* [[https:// | * [[https:// |