{"about":{"site":"https://codewithpapers.app","non_affiliation":"Code with Papers and Syntology are not affiliated with, endorsed by, or sponsored by Papers with Code, Meta, or the pwc-archive mirror.","licence":"CC BY-SA 4.0","licence_url":"https://creativecommons.org/licenses/by-sa/4.0/legalcode","attribution":"https://codewithpapers.app/attribution","modified":"archive material modified by Syntology; see the attribution page"},"url":"/paper/bm25s-orders-of-magnitude-faster-lexical","title":"BM25S: Orders of magnitude faster lexical search via eager sparse scoring","arxiv_id":"2407.03618","date":"2024-07-04","proceeding":null,"authors":["Xing Han Lù"],"abstract":"We introduce BM25S, an efficient Python-based implementation of BM25 that only depends on Numpy and Scipy. BM25S achieves up to a 500x speedup compared to the most popular Python-based framework by eagerly computing BM25 scores during indexing and storing them into sparse matrices. It also achieves considerable speedups compared to highly optimized Java-based implementations, which are used by popular commercial products. Finally, BM25S reproduces the exact implementation of five BM25 variants based on Kamphuis et al. (2020) by extending eager scoring to non-sparse variants using a novel score shifting method. The code can be found at https://github.com/xhluca/bm25s","url_abs":"https://arxiv.org/abs/2407.03618v1","url_pdf":"https://arxiv.org/pdf/2407.03618v1.pdf","source":{"archive":"pwc-archive (Hugging Face), CC BY-SA 4.0","snapshot":"2025-07-28","licence_url":"https://creativecommons.org/licenses/by-sa/4.0/legalcode","row_kind":"abstracts"},"code_links":[{"paper_slug":"bm25s-orders-of-magnitude-faster-lexical","repo_url":"https://github.com/xhluca/bm25s","is_official":1,"mentioned_in_paper":1,"mentioned_in_github":1,"framework":"pytorch","reach":{"status":"ok","spdx":"MIT"}},{"paper_slug":"bm25s-orders-of-magnitude-faster-lexical","repo_url":"https://github.com/conda-forge/bm25s-feedstock","is_official":0,"mentioned_in_paper":0,"mentioned_in_github":0,"framework":"none","reach":{"status":"ok","spdx":"BSD-3-Clause"}},{"paper_slug":"bm25s-orders-of-magnitude-faster-lexical","repo_url":"https://github.com/xhluca/bm25-benchmarks","is_official":0,"mentioned_in_paper":0,"mentioned_in_github":0,"framework":"none","reach":{"status":"ok","spdx":"MIT"}}],"tasks":[{"task_slug":"passage-retrieval","task_name":"Passage Retrieval"},{"task_slug":"retrieval","task_name":"Retrieval"},{"task_slug":"text-retrieval","task_name":"Text Retrieval"},{"task_slug":"zero-shot-text-search","task_name":"Zero-shot Text Search"}],"methods":[],"datasets_introduced":[],"methods_introduced":[],"results":[{"leaderboard":"/sota/retrieval-on-hotpotqa","task":"Retrieval","dataset":"HotpotQA","model":"BM25S","rank_in_archive_order":1,"of":3,"metrics":{"Queries per second":"20.88"},"uses_additional_data":false},{"leaderboard":"/sota/retrieval-on-hotpotqa","task":"Retrieval","dataset":"HotpotQA","model":"Elasticsearch","rank_in_archive_order":2,"of":3,"metrics":{"Queries per second":"7.11"},"uses_additional_data":false},{"leaderboard":"/sota/retrieval-on-hotpotqa","task":"Retrieval","dataset":"HotpotQA","model":"Rank-BM25","rank_in_archive_order":3,"of":3,"metrics":{"Queries per second":"0.04"},"uses_additional_data":false},{"leaderboard":"/sota/retrieval-on-natural-questions","task":"Retrieval","dataset":"Natural Questions","model":"BM25S","rank_in_archive_order":1,"of":3,"metrics":{"Queries per second":"41.85"},"uses_additional_data":false},{"leaderboard":"/sota/retrieval-on-natural-questions","task":"Retrieval","dataset":"Natural Questions","model":"Elasticsearch","rank_in_archive_order":2,"of":3,"metrics":{"Queries per second":"12.16"},"uses_additional_data":false},{"leaderboard":"/sota/retrieval-on-natural-questions","task":"Retrieval","dataset":"Natural Questions","model":"Rank-BM25","rank_in_archive_order":3,"of":3,"metrics":{"Queries per second":"0.10"},"uses_additional_data":false},{"leaderboard":"/sota/retrieval-on-quora-question-pairs","task":"Retrieval","dataset":"Quora Question Pairs","model":"BM25S","rank_in_archive_order":1,"of":4,"metrics":{"Queries per second":"183.53"},"uses_additional_data":false},{"leaderboard":"/sota/retrieval-on-quora-question-pairs","task":"Retrieval","dataset":"Quora Question Pairs","model":"Elasticsearch","rank_in_archive_order":2,"of":4,"metrics":{"Queries per second":"21.8"},"uses_additional_data":false},{"leaderboard":"/sota/retrieval-on-quora-question-pairs","task":"Retrieval","dataset":"Quora Question Pairs","model":"BM25-PT","rank_in_archive_order":3,"of":4,"metrics":{"Queries per second":"6.49"},"uses_additional_data":false},{"leaderboard":"/sota/retrieval-on-quora-question-pairs","task":"Retrieval","dataset":"Quora Question Pairs","model":"Rank-BM25","rank_in_archive_order":4,"of":4,"metrics":{"Queries per second":"1.18"},"uses_additional_data":false},{"leaderboard":"/sota/text-retrieval-on-climate-fever","task":"Text Retrieval","dataset":"CLIMATE-FEVER","model":"Lucene (BM25S)","rank_in_archive_order":1,"of":1,"metrics":{"nDCG@10":"16.2"},"uses_additional_data":false},{"leaderboard":"/sota/text-retrieval-on-dbpedia","task":"Text Retrieval","dataset":"DBpedia","model":"Lucene (BM25S)","rank_in_archive_order":1,"of":1,"metrics":{"nDCG@10":"31.9"},"uses_additional_data":false},{"leaderboard":"/sota/text-retrieval-on-fever","task":"Text Retrieval","dataset":"FEVER","model":"Lucene (BM25S)","rank_in_archive_order":1,"of":1,"metrics":{"nDCG@10":"63.8"},"uses_additional_data":false},{"leaderboard":"/sota/text-retrieval-on-hotpotqa","task":"Text Retrieval","dataset":"HotpotQA","model":"Lucene (BM25S)","rank_in_archive_order":1,"of":1,"metrics":{"nDCG@10":"62.9"},"uses_additional_data":false},{"leaderboard":"/sota/text-retrieval-on-ms-marco","task":"Text Retrieval","dataset":"MS MARCO","model":"Lucene (BM25S)","rank_in_archive_order":1,"of":1,"metrics":{"NDCG@10":"22.8"},"uses_additional_data":false},{"leaderboard":"/sota/text-retrieval-on-nfcorpus","task":"Text Retrieval","dataset":"NFCorpus","model":"Lucene (BM25S)","rank_in_archive_order":1,"of":1,"metrics":{"nDCG@10":"31.8"},"uses_additional_data":false},{"leaderboard":"/sota/text-retrieval-on-natural-questions","task":"Text Retrieval","dataset":"Natural Questions","model":"Lucene (BM25S)","rank_in_archive_order":1,"of":1,"metrics":{"NDCG@10":"30.5"},"uses_additional_data":false},{"leaderboard":"/sota/text-retrieval-on-quora-question-pairs","task":"Text Retrieval","dataset":"Quora Question Pairs","model":"Lucene (BM25S)","rank_in_archive_order":1,"of":1,"metrics":{"nDCG@10":"78.7"},"uses_additional_data":false},{"leaderboard":"/sota/text-retrieval-on-scidocs","task":"Text Retrieval","dataset":"SciDocs","model":"Lucene (BM25S)","rank_in_archive_order":1,"of":1,"metrics":{"nDCG@10":"67.6"},"uses_additional_data":false},{"leaderboard":"/sota/text-retrieval-on-scifact","task":"Text Retrieval","dataset":"SciFact","model":"Lucene (BM25S)","rank_in_archive_order":1,"of":1,"metrics":{"nDCG@10":"15"},"uses_additional_data":false},{"leaderboard":"/sota/text-retrieval-on-trec-covid","task":"Text Retrieval","dataset":"TREC-COVID","model":"Lucene (BM25S)","rank_in_archive_order":1,"of":1,"metrics":{"nDCG@10":"58.9"},"uses_additional_data":false}],"syntology":{"syntology_url":"https://syntology.ai/paper/2407.03618","atlas_url":"https://app.syntology.ai/?focus=2407.03618","mcp":{"get_harvested_code_for_paper":{"arxiv_id":"2407.03618"}},"developers":"https://syntology.ai/developers","read_at":"2026-09-25T09:33:49+00:00","read_at_is":"when the build read Syntology's graph, not when any sample ran","claim":"Per-sample execution status on synthesized fixtures; not a correctness claim about the paper. Samples come from repositories linked to the paper, official or community; repo_kind says which.","repos":[{"provenance":"external:paperswithcode_snapshot_2025-07-28","url":"https://github.com/xhluca/bm25-benchmarks","reach":{"status":"ok","spdx":"MIT"}},{"provenance":"external:paperswithcode_snapshot_2025-07-28","url":"https://github.com/xhluca/bm25s","reach":{"status":"ok","spdx":"MIT"}},{"provenance":"external:paperswithcode_snapshot_2025-07-28","url":"https://github.com/conda-forge/bm25s-feedstock","reach":{"status":"ok","spdx":"BSD-3-Clause"}}],"summary":{"ran":15,"unverified":7},"by_repo_kind":{"official":{"samples":17,"ran":10,"repositories":1},"listed":{"samples":5,"ran":5,"repositories":1}},"repo_kind_vocabulary":{"official":"The archive marks this repository official for the paper","named_in_paper":"The archive records that the paper mentions this repository; it is not marked official","listed":"In the archive's code links for this paper, not marked official and not recorded as mentioned in the paper","found_in_text":"Syntology found this repository in the paper's own text; whether it is the authors' implementation is not asserted","community":"Not in the archive's code links for this paper; a community repository Syntology harvested"},"n_pointer_only_for_licence":0,"samples":[{"code_sha256_prefix":"e7083f6103f913bb","entry":"can_save_locally","repo":"xhluca/bm25s","repo_kind":"official","path":"bm25s/hf.py","file_url":"https://github.com/xhluca/bm25s/blob/HEAD/bm25s/hf.py","link_basis":"first_harvest_node","language":"python","status":"ran","verification_level":1,"contract_check":null,"metamorphic_tier":null,"behaviour_fingerprint":false,"licence":"MIT","inline_ok":true,"mcp_get_code":{"code_sha256":"e7083f6103f913bb"}},{"code_sha256_prefix":"05fff06955fafff6","entry":"change_extension","repo":"xhluca/bm25s","repo_kind":"official","path":"bm25s/utils/corpus.py","file_url":"https://github.com/xhluca/bm25s/blob/HEAD/bm25s/utils/corpus.py","link_basis":"first_harvest_node","language":"python","status":"ran","verification_level":1,"contract_check":null,"metamorphic_tier":null,"behaviour_fingerprint":true,"licence":"MIT","inline_ok":true,"mcp_get_code":{"code_sha256":"05fff06955fafff6"}},{"code_sha256_prefix":"d4e1a0e6133bc36b","entry":"clean_results_keys","repo":"xhluca/bm25s","repo_kind":"official","path":"bm25s/utils/beir.py","file_url":"https://github.com/xhluca/bm25s/blob/HEAD/bm25s/utils/beir.py","link_basis":"first_harvest_node","language":"python","status":"ran","verification_level":1,"contract_check":null,"metamorphic_tier":null,"behaviour_fingerprint":false,"licence":"MIT","inline_ok":true,"mcp_get_code":{"code_sha256":"d4e1a0e6133bc36b"}},{"code_sha256_prefix":"f16a6001458fe054","entry":"compute_top_k_from_scores","repo":"xhluca/bm25-benchmarks","repo_kind":"listed","path":"benchmark/on_bm25_pt.py","file_url":"https://github.com/xhluca/bm25-benchmarks/blob/HEAD/benchmark/on_bm25_pt.py","link_basis":"harvester_set","language":"python","status":"ran","verification_level":1,"contract_check":null,"metamorphic_tier":null,"behaviour_fingerprint":false,"licence":"MIT","inline_ok":true,"mcp_get_code":{"code_sha256":"f16a6001458fe054"}},{"code_sha256_prefix":"cda747e09a9100fd","entry":"compute_top_k_from_scores","repo":"xhluca/bm25-benchmarks","repo_kind":"listed","path":"benchmark/on_rank_bm25.py","file_url":"https://github.com/xhluca/bm25-benchmarks/blob/HEAD/benchmark/on_rank_bm25.py","link_basis":"harvester_set","language":"python","status":"ran","verification_level":1,"contract_check":null,"metamorphic_tier":null,"behaviour_fingerprint":false,"licence":"MIT","inline_ok":true,"mcp_get_code":{"code_sha256":"cda747e09a9100fd"}},{"code_sha256_prefix":"ab7f90eda021ae13","entry":"convert_tokenized_to_string_list","repo":"xhluca/bm25s","repo_kind":"official","path":"bm25s/tokenization.py","file_url":"https://github.com/xhluca/bm25s/blob/HEAD/bm25s/tokenization.py","link_basis":"first_harvest_node","language":"python","status":"ran","verification_level":1,"contract_check":null,"metamorphic_tier":null,"behaviour_fingerprint":false,"licence":"MIT","inline_ok":true,"mcp_get_code":{"code_sha256":"ab7f90eda021ae13"}},{"code_sha256_prefix":"59ca7ac3fdaff9b0","entry":"dumps_with_builtin","repo":"xhluca/bm25s","repo_kind":"official","path":"bm25s/utils/json_functions.py","file_url":"https://github.com/xhluca/bm25s/blob/HEAD/bm25s/utils/json_functions.py","link_basis":"first_harvest_node","language":"python","status":"ran","verification_level":1,"contract_check":null,"metamorphic_tier":null,"behaviour_fingerprint":false,"licence":"MIT","inline_ok":true,"mcp_get_code":{"code_sha256":"59ca7ac3fdaff9b0"}},{"code_sha256_prefix":"cae3ad88ac9412a8","entry":"evaluate","repo":"xhluca/bm25-benchmarks","repo_kind":"listed","path":"benchmark/on_bm25s.py","file_url":"https://github.com/xhluca/bm25-benchmarks/blob/HEAD/benchmark/on_bm25s.py","link_basis":"harvester_set","language":"python","status":"ran","verification_level":1,"contract_check":null,"metamorphic_tier":null,"behaviour_fingerprint":false,"licence":"MIT","inline_ok":true,"mcp_get_code":{"code_sha256":"cae3ad88ac9412a8"}},{"code_sha256_prefix":"ac6986c427c852da","entry":"format_beir_result_keys","repo":"xhluca/bm25-benchmarks","repo_kind":"listed","path":"benchmark/on_pisa.py","file_url":"https://github.com/xhluca/bm25-benchmarks/blob/HEAD/benchmark/on_pisa.py","link_basis":"harvester_set","language":"python","status":"ran","verification_level":1,"contract_check":null,"metamorphic_tier":null,"behaviour_fingerprint":false,"licence":"MIT","inline_ok":true,"mcp_get_code":{"code_sha256":"ac6986c427c852da"}},{"code_sha256_prefix":"0a07896a7f42f858","entry":"heap_pop","repo":"xhluca/bm25s","repo_kind":"official","path":"bm25s/numba/selection.py","file_url":"https://github.com/xhluca/bm25s/blob/HEAD/bm25s/numba/selection.py","link_basis":"first_harvest_node","language":"python","status":"ran","verification_level":1,"contract_check":null,"metamorphic_tier":null,"behaviour_fingerprint":false,"licence":"MIT","inline_ok":true,"mcp_get_code":{"code_sha256":"0a07896a7f42f858"}},{"code_sha256_prefix":"cd3dee563db75da9","entry":"is_dir_empty","repo":"xhluca/bm25s","repo_kind":"official","path":"bm25s/hf.py","file_url":"https://github.com/xhluca/bm25s/blob/HEAD/bm25s/hf.py","link_basis":"first_harvest_node","language":"python","status":"ran","verification_level":1,"contract_check":null,"metamorphic_tier":null,"behaviour_fingerprint":false,"licence":"MIT","inline_ok":true,"mcp_get_code":{"code_sha256":"cd3dee563db75da9"}},{"code_sha256_prefix":"4cc099c26fff4c42","entry":"load_qrels_dict","repo":"xhluca/bm25-benchmarks","repo_kind":"listed","path":"benchmark/on_bm25s.py","file_url":"https://github.com/xhluca/bm25-benchmarks/blob/HEAD/benchmark/on_bm25s.py","link_basis":"harvester_set","language":"python","status":"ran","verification_level":1,"contract_check":null,"metamorphic_tier":null,"behaviour_fingerprint":false,"licence":"MIT","inline_ok":true,"mcp_get_code":{"code_sha256":"4cc099c26fff4c42"}},{"code_sha256_prefix":"bd26864807521fc2","entry":"postprocess_results_for_eval","repo":"xhluca/bm25s","repo_kind":"official","path":"bm25s/utils/beir.py","file_url":"https://github.com/xhluca/bm25s/blob/HEAD/bm25s/utils/beir.py","link_basis":"first_harvest_node","language":"python","status":"ran","verification_level":1,"contract_check":null,"metamorphic_tier":null,"behaviour_fingerprint":false,"licence":"MIT","inline_ok":true,"mcp_get_code":{"code_sha256":"bd26864807521fc2"}},{"code_sha256_prefix":"679762797d78948e","entry":"topk","repo":"xhluca/bm25s","repo_kind":"official","path":"bm25s/selection.py","file_url":"https://github.com/xhluca/bm25s/blob/HEAD/bm25s/selection.py","link_basis":"first_harvest_node","language":"python","status":"ran","verification_level":1,"contract_check":null,"metamorphic_tier":null,"behaviour_fingerprint":false,"licence":"MIT","inline_ok":true,"mcp_get_code":{"code_sha256":"679762797d78948e"}},{"code_sha256_prefix":"95129e49e1d55862","entry":"topk","repo":"xhluca/bm25s","repo_kind":"official","path":"bm25s/numba/selection.py","file_url":"https://github.com/xhluca/bm25s/blob/HEAD/bm25s/numba/selection.py","link_basis":"first_harvest_node","language":"python","status":"ran","verification_level":1,"contract_check":null,"metamorphic_tier":null,"behaviour_fingerprint":false,"licence":"MIT","inline_ok":true,"mcp_get_code":{"code_sha256":"95129e49e1d55862"}},{"code_sha256_prefix":"4690c1cf386dfd10","entry":"batch_tokenize","repo":"xhluca/bm25s","repo_kind":"official","path":"bm25s/hf.py","file_url":"https://github.com/xhluca/bm25s/blob/HEAD/bm25s/hf.py","link_basis":"first_harvest_node","language":"python","status":"unverified","verification_level":0,"contract_check":null,"metamorphic_tier":null,"behaviour_fingerprint":false,"licence":"MIT","inline_ok":true,"mcp_get_code":{"code_sha256":"4690c1cf386dfd10"}},{"code_sha256_prefix":"a195383bf3405f8c","entry":"download_dataset","repo":"xhluca/bm25s","repo_kind":"official","path":"bm25s/utils/beir.py","file_url":"https://github.com/xhluca/bm25s/blob/HEAD/bm25s/utils/beir.py","link_basis":"first_harvest_node","language":"python","status":"unverified","verification_level":0,"contract_check":null,"metamorphic_tier":null,"behaviour_fingerprint":false,"licence":"MIT","inline_ok":true,"mcp_get_code":{"code_sha256":"a195383bf3405f8c"}},{"code_sha256_prefix":"16c525229af810b0","entry":"dumps_with_orjson","repo":"xhluca/bm25s","repo_kind":"official","path":"bm25s/utils/json_functions.py","file_url":"https://github.com/xhluca/bm25s/blob/HEAD/bm25s/utils/json_functions.py","link_basis":"first_harvest_node","language":"python","status":"unverified","verification_level":0,"contract_check":null,"metamorphic_tier":null,"behaviour_fingerprint":false,"licence":"MIT","inline_ok":true,"mcp_get_code":{"code_sha256":"16c525229af810b0"}},{"code_sha256_prefix":"572c5677af80154d","entry":"find_newline_positions","repo":"xhluca/bm25s","repo_kind":"official","path":"bm25s/utils/corpus.py","file_url":"https://github.com/xhluca/bm25s/blob/HEAD/bm25s/utils/corpus.py","link_basis":"first_harvest_node","language":"python","status":"unverified","verification_level":0,"contract_check":null,"metamorphic_tier":null,"behaviour_fingerprint":false,"licence":"MIT","inline_ok":true,"mcp_get_code":{"code_sha256":"572c5677af80154d"}},{"code_sha256_prefix":"c7e33bb0befabc76","entry":"get_max_memory_usage","repo":"xhluca/bm25s","repo_kind":"official","path":"bm25s/utils/benchmark.py","file_url":"https://github.com/xhluca/bm25s/blob/HEAD/bm25s/utils/benchmark.py","link_basis":"first_harvest_node","language":"python","status":"unverified","verification_level":0,"contract_check":null,"metamorphic_tier":null,"behaviour_fingerprint":false,"licence":"MIT","inline_ok":true,"mcp_get_code":{"code_sha256":"c7e33bb0befabc76"}},{"code_sha256_prefix":"05a414c3417e7237","entry":"load_mmindex","repo":"xhluca/bm25s","repo_kind":"official","path":"bm25s/utils/corpus.py","file_url":"https://github.com/xhluca/bm25s/blob/HEAD/bm25s/utils/corpus.py","link_basis":"first_harvest_node","language":"python","status":"unverified","verification_level":0,"contract_check":null,"metamorphic_tier":null,"behaviour_fingerprint":false,"licence":"MIT","inline_ok":true,"mcp_get_code":{"code_sha256":"05a414c3417e7237"}},{"code_sha256_prefix":"7c70347879b998bf","entry":"tokenize","repo":"xhluca/bm25s","repo_kind":"official","path":"bm25s/tokenization.py","file_url":"https://github.com/xhluca/bm25s/blob/HEAD/bm25s/tokenization.py","link_basis":"first_harvest_node","language":"python","status":"unverified","verification_level":0,"contract_check":null,"metamorphic_tier":null,"behaviour_fingerprint":false,"licence":"MIT","inline_ok":true,"mcp_get_code":{"code_sha256":"7c70347879b998bf"}}]},"arxiv_metadata":null,"syntology_extracted_results":null}