{"id":44350995,"url":"https://github.com/radlab-dev-group/semantic-search-engine","last_synced_at":"2026-02-11T15:06:00.515Z","repository":{"id":331522272,"uuid":"1123691844","full_name":"radlab-dev-group/semantic-search-engine","owner":"radlab-dev-group","description":"A lightweight, extensible toolkit for preparing, indexing, and querying textual data for semantic search and downstream NLP tasks.","archived":false,"fork":false,"pushed_at":"2026-01-18T20:48:43.000Z","size":259,"stargazers_count":2,"open_issues_count":2,"forks_count":1,"subscribers_count":1,"default_branch":"main","last_synced_at":"2026-01-19T04:00:05.531Z","etag":null,"topics":["information-retrieval","information-retrieval-engine","production","rag","rag-engine","search","semantic","semantic-search","semantic-search-engine","semantic-search-service","sse"],"latest_commit_sha":null,"homepage":"","language":"Python","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"apache-2.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/radlab-dev-group.png","metadata":{"files":{"readme":"README-pl.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2025-12-27T12:15:35.000Z","updated_at":"2026-01-17T14:19:09.000Z","dependencies_parsed_at":null,"dependency_job_id":null,"html_url":"https://github.com/radlab-dev-group/semantic-search-engine","commit_stats":null,"previous_names":["radlab-dev-group/semantic-search-engine"],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/radlab-dev-group/semantic-search-engine","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/radlab-dev-group%2Fsemantic-search-engine","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/radlab-dev-group%2Fsemantic-search-engine/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/radlab-dev-group%2Fsemantic-search-engine/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/radlab-dev-group%2Fsemantic-search-engine/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/radlab-dev-group","download_url":"https://codeload.github.com/radlab-dev-group/semantic-search-engine/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/radlab-dev-group%2Fsemantic-search-engine/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":29336097,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-02-11T14:34:07.188Z","status":"ssl_error","status_checked_at":"2026-02-11T14:34:06.809Z","response_time":97,"last_error":"SSL_connect returned=1 errno=0 peeraddr=140.82.121.6:443 state=error: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["information-retrieval","information-retrieval-engine","production","rag","rag-engine","search","semantic","semantic-search","semantic-search-engine","semantic-search-service","sse"],"created_at":"2026-02-11T15:05:59.630Z","updated_at":"2026-02-11T15:06:00.508Z","avatar_url":"https://github.com/radlab-dev-group.png","language":"Python","funding_links":[],"categories":[],"sub_categories":[],"readme":"## Moduł`engine.controllers.search.DBSemanticSearchController`\n\nLogika wyszukiwania jest w ogólnej mierze nastepująca:\n\n1. W pierwszym kroku, na podstawie meta-informacji przygotowywane są dokumenty,\n   w których przeszukiwana będzie fraza. Ten krok ogranicza przestrzeń w bazie semantycznej.\n   Tylko przefiltrowane w tym kroku dokumenty będą uwzględniane podczas przeszukiwania\n   semantycznego. W tym kroku bardzo dużo błędnych dokumentów odrzucamy na starcie,\n   zanim zaczniemy przeszukiwanie semantyczne.\n2. Do przeszukiwania semantycznego wykorzystywany jest oczywiście aspekt podobieństwa\n   semantycznego, jednak zamiast przeszukiwać całą bazę semantyczną,\n   przeszukiwane są tylko dokumenty, które wyszły z _Kroku 1_.\n\n### Wyszukiwanie z opcjami, metoda `search_with_options`\n\n```python\ndef search_with_options(\n        self,\n        question_str: str,\n        search_params: dict,\n        convert_to_pd: bool = False,\n        reformat_to_display: bool = False,\n        ignore_question_lang_detect: bool = False,\n        organisation_user: OrganisationUser = None,\n        collection: CollectionOfDocuments = None,\n        user_query: UserQuery = None,\n):\n    ...\n```\n\nWażnym elementem jest`search_params`, to słownik, który służy do filtrowania dokumentów przed\nprzeszukiwaniem wyszukiwarki semantycznej. Słownik ten posiada pola:\n\n* `categories` -- jako lista kategorii (stringów), dokument musi posiadać co\n  najmniej jedną z tych kategorii, dokument ma przypisaną jedną kategorię główną\n  (`document.category`) i to ona jest sprawdzana z tą listą.\n* `documents` -- lista nazw dokumentów, które mają być brane pod uwagę podczas\n  przeszukiwania, tylko te wskazane dokumenty będą przeszukiwane\n* `relative_path` -- podobnie jak dokumenty, ale wskazane ściezki relatywne.\n  W dokumentach kilka może mieć taką samą nazwę, ale tylko jeden posiada\n  daną ściezkę relatywną.\n* `relative_path_contains` -- Lista fraz, którymi przefiltrować tylko takie dokumenty,\n  które zawierają co najmniej jedną ze zdefiniowanych fraz. Może się przydać, kiedy np.\n  sciezka relatywna, to _url_ strony. Wtedy tą listą można przefiltrować strony po domenie,\n  a właściwie po liście domen -- można tym sposobem wybrać tylko teksty z określonych urli.\n* `templates` -- lista identyfikatorów templatek, którymi maja być filtrowane dokumenty\n* `metadata_filter` -- dowolny filtr oparty o przeszukiwanie metadanych\n  (pole `metadata_json` w `Document`)\n* `only_template_documents` -- znacznik _boolowski_, który domyślnie jest wyłaczony.\n  Włączenie tego przełącznika powoduje, że tylko dokumenty spełniający założenia templatek\n  będą wykorzystywane do wuszkiwania. Jeżeli ustawiona na _False_ wtedy również inne\n  mechanizmy filtrujące będą ogrniczały wyniki.\n\n**Flow** filtrowania meta-informacjami jest nastepujący:\n\n1. Jeżeli przekazane były kategorie, to z bazy wybierane są te dokumenty,\n   które posiadają jedną z przekazanych kategorii. Pobierane są nazwy tych dokumentów.\n   Dokumenty te odkładane są jako **pierwsza kupka dokumentów**.\n2. Jeżeli podane zostały identyfikatory templatek, to niezależnie od punktu 1.\n   tworzona jest **druga kupka dokumentów**. Wybierane są tylko takie dokumenty,\n   które spełniają założenia przekazanych szablonów.\n3. Tworzona jest **kupka dokumentów** `documents` (ze słownika `search_params`)\n4. Tworzona jest **kupka relatywnych ścieżek** ze słownika `search_params`\n6. Tworzona jest **kupka dokumentów** na podstawie `metadata_filters`\n7. Jeżeli ustawiona jest flaga `only_template_documents` to wszystkie\n   kupki są usuwane, poza kupką z dokumentów, które dopasowane zostały\n   na podstawie templatek. Wszysatko inne jest ignorowane -- nie ma\n   innych ograniczeń na dokumenty.\n8. Jeżeli ta flaga jest ustawiona na _False_ kupki z nazwami dokumentów\n   łączone są do jedenk kupki z _nazwami dokumentów_. Braną są wszyskie nazwy dokumentów.\n   Jeżeli dokument wystepouje tylko na jednej z kupek również jest brany pod uwagę.\n   Nie jest wymagane aby dokument spełnił wszystkie filtry, musi spełnic co najmniej\n   jeden i wtedy przechodzi do wyszukiwarki semantycznej.\n\nPrzkładowe zapisy `metadata_filters`:\n\n```json\n[\n  {\n    \"operator\": \"in\",\n    \"field\": {\n      \"deep_labels\": {\n        \"0\": [\n          \"kategoria\"\n        ]\n      }\n    }\n  },\n  {\n    \"operator\": \"eq\",\n    \"field\": {\n      \"main_category\": \"kategoria\"\n    }\n  },\n  {\n    \"operator\": \"lt\",\n    \"field\": {\n      \"kategoria\": {\n        \"gdzie_wartosc\": {\n          \"jest_bardzo_gleboko\": 100\n        }\n      }\n    }\n  }\n]\n```\n\nDostępne operatory: `[\"in\", \"eq\", \"ne\", \"gt\", \"lt\", \"gte\", \"lte\", \"hse\"]`.\nGdzie `hse` (_has same element_) to operacja, która służy do sprawdzania czy dwa\nzbiory posiadają taki sam element. Np. posiadając dwie listy można sprawdzić\nczy zawierają jakiś wspólny element. Przykłady działania `hse`\nna dwóch listach `list_a` oraz `list_b`.\n\n```\nlist_a = [1, 2] list_b = [2, 5, 6, 7] --\u003e return True\nlist_a = [], list_b = [2, 5, 6, 7] --\u003e return False\nlist_a = [2] list_b = [2, 5, 6, 7] --\u003e return True\nlist_a = [1, 2, 3, 5] list_b = [6, 7] --\u003e return False\nlist_a = [1, 2, 3, 5] list_b = [5] --\u003e return True\n```\n\nPodczas porównywania pojedycznego operatora z metadanymi, możliwe jest dowolne\nzagłębienie słowników.\n\nPoniżej znajduje się przykładaowa definicja metadanych `md_dict` oraz kilku\nwyrażeń filtrujących z różnymi opratorami.\n\n```python\n# %%\nmd_dict = {\n    \"deep_labels\": {\n        \"0\": [],\n        \"1\": [\n            \"Konflikty i kryzysy\"\n        ],\n        \"2\": [\n            \"Informacje o Ukrainie w czasie kryzysu.\"\n        ],\n        \"3\": [\n            \"Napady Naturalne i Konflikty Militarne\"\n        ],\n        \"4\": [\n            \"Konflikty zbrojne na Ukrainie.\"\n        ],\n        \"5\": {\n            \"6\": {\n                \"7\": 125\n            }\n        }\n    },\n    \"channel\": \"TCH_channel\",\n    \"dataset_id\": \"Telegram UA\",\n    \"main_label\": \"Konflikty zbrojne na Ukrainie.\",\n    \"clear_texts\": False,\n}\n\n# Filtering expressions with operators\n# 1\ne_dict_1 = {\n    \"deep_labels\": {\n        \"1\": \"Konflikty i kryzysy\"\n    }\n}\ne_op_1 = \"in\"\n# 2\ne_dict_2 = {\n    \"main_label\": \"Konflikty zbrojne na Ukrainie.\"\n}\ne_op_2 = \"gt\"\n# 3\ne_dict_3 = {\n    \"deep_labels\": {\n        \"5\": {\n            \"6\": {\n                \"7\": 125\n            }\n        }\n    }\n}\ne_op_3 = \"eq\"\n```\n\nWynik działania/pokrycia eyrażeń na metadanych:\n\n``` \nKonflikty i kryzysy in ['Konflikty i kryzysy'] -\u003e True\nKonflikty zbrojne na Ukrainie. gt Konflikty zbrojne na Ukrainie. -\u003e False\n125 eq 125 -\u003e True\n```\n\nPo wyżej przedstawionej procedurze uruchamiane jest wyszukiwanie:\n\n```python\nquery_results = self.search(\n    search_text=question_str,\n    max_results=search_params.get(\"max_results\", 50),\n    rerank_results=search_params.get(\"rerank_results\", False),\n    language=lang_str,\n    return_with_factored_fields=search_params.get(\n        \"return_with_factored_fields\", False\n    ),\n    search_in_documents=docs_to_search,\n    relative_paths=relative_paths,\n)[0]\n```\n\nW tej metodzie do przeszukiwania semantycznego wykorzystywany jest\nhandler do Milvusa. Pamiętajmy, że tutaj przeszukujemy bazę semantyczną\nczyli określamy podobieństwo między dwoma _reprezentacjami embeddingowymi_\ntekstów -- pytania i fragmentu dokumentu. Dla embeddingu pytania\nodszukiwane są najbardziej podobne embeddingi z fragmentami tekstów.\n\nTworzonyt jest słownik opcji do filtrowania\nw Milvusie (po metadanych). Tworzony jest słownik `metadata_filter`\na do niego wpisywane są trzy wartości:\n\n1. `language` -- jeżeli podano, to tylko _embeddingi_ ze wskazanym językiem będą przeszukiwane;\n2. `filenames` -- lista nazw dokumentów -- tylko embeddinigi z tymi nazwami będą przeszukiwane;\n3. `relative_paths` -- lista ścieżek relatywnych -- podobnie jak `filenames` jednak ściezki relatywne;\n\nJeżeli podano więcej niż jeden z ww wartości, to w odróżnieniu od bazy relacyjnej,\nw Milvusie wybierane są do przeszukiwania te embeddingi,\nktóre spełniają warunek połączomy `AND`, nie `OR \n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fradlab-dev-group%2Fsemantic-search-engine","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fradlab-dev-group%2Fsemantic-search-engine","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fradlab-dev-group%2Fsemantic-search-engine/lists"}