{"record":{"id":"bf8dcf85ef20ea1e","repo":"ankane/searchkick","slug":"distance-must-match-searchkick-options","errorCode":null,"errorMessage":"distance must match searchkick options","messagePattern":"distance must match searchkick options","errorType":"exception","errorClass":"ArgumentError","httpStatus":null,"severity":"error","filePath":"lib/searchkick/query.rb","lineNumber":1042,"sourceCode":"          if ef_search && Searchkick.server_below?(\"2.16.0\")\n            raise Error, \"ef_search requires OpenSearch 2.16+\"\n          end\n\n          payload[:query] = {\n            knn: {\n              field.to_sym => {\n                vector: vector,\n                k: k,\n                filter: filter\n              }.merge(ef_search ? {method_parameters: {ef_search: ef_search}} : {})\n            }\n          }\n        end\n      else\n        if exact\n          # prevent incorrect distances/results with Elasticsearch 9.0.0-rc1\n          if !Searchkick.server_below?(\"9.0.0\") && field_options[:distance] == \"cosine\" && distance != \"cosine\"\n            raise ArgumentError, \"distance must match searchkick options\"\n          end\n\n          # https://github.com/elastic/elasticsearch/blob/main/docs/reference/vectors/vector-functions.asciidoc\n          source =\n            case distance\n            when \"cosine\"\n              \"(cosineSimilarity(params.query_vector, params.field) + 1.0) * 0.5\"\n            when \"euclidean\"\n              \"double l2 = l2norm(params.query_vector, params.field); 1 / (1 + l2 * l2)\"\n            when \"taxicab\"\n              \"1 / (1 + l1norm(params.query_vector, params.field))\"\n            when \"inner_product\"\n              \"double dot = dotProduct(params.query_vector, params.field); dot > 0 ? dot + 1 : 1 / (1 - dot)\"\n            else\n              raise ArgumentError, \"Unknown distance: #{distance}\"\n            end\n\n          payload[:query] = {","sourceCodeStart":1024,"sourceCodeEnd":1060,"githubUrl":"https://github.com/ankane/searchkick/blob/93e901a75b11a25101668a616e006b158251b16e/lib/searchkick/query.rb#L1024-L1060","documentation":"Error \"distance must match searchkick options\" thrown in ankane/searchkick.","triggerScenarios":"Thrown at lib/searchkick/query.rb:1042 when the library encounters an invalid state.","commonSituations":"See trigger scenarios.","solutions":[],"exampleFix":null,"handlingStrategy":null,"validationCode":null,"typeGuard":null,"tryCatchPattern":null,"preventionTips":[],"tags":[],"backgroundTag":null,"analyzedSha":"93e901a75b11a25101668a616e006b158251b16e","analyzedAt":"2026-08-21T19:06:23.767Z","schemaVersion":2},"datasetVersion":"2026-08-21T23:17:16.201Z"}