From bbec7b2a5b3d0eb4dcf560c24e4853e96995b276 Mon Sep 17 00:00:00 2001 From: Rok Garbas Date: Sat, 8 Aug 2020 01:22:52 +0200 Subject: [PATCH] search on multiple fields not just package_attr_name or option_name (#145) fixes #134 --- src/Page/Options.elm | 12 ++++- src/Page/Packages.elm | 13 ++++- src/Search.elm | 112 +++++++++++++++++++++++------------------- 3 files changed, 85 insertions(+), 52 deletions(-) diff --git a/src/Page/Options.elm b/src/Page/Options.elm index 5e8926b..74be486 100644 --- a/src/Page/Options.elm +++ b/src/Page/Options.elm @@ -398,7 +398,17 @@ makeRequest options channel queryRaw from size sort = |> List.append (should_match 10) in Search.makeRequest - (Search.makeRequestBody query from size sort "option" "option_name" "option_name_query" should_queries) + (Search.makeRequestBody query + from + size + sort + "option" + "option_name" + [ "option_name_query" + , "option_description" + ] + should_queries + ) ("latest-" ++ String.fromInt options.mappingSchemaVersion ++ "-" ++ channel) decodeResultItemSource options diff --git a/src/Page/Packages.elm b/src/Page/Packages.elm index 966ab9a..30ee687 100644 --- a/src/Page/Packages.elm +++ b/src/Page/Packages.elm @@ -505,7 +505,18 @@ makeRequest options channel queryRaw from size sort = |> List.append (should_match 10) in Search.makeRequest - (Search.makeRequestBody query from size sort "package" "package_attr_name" "package_attr_name_query" should_queries) + (Search.makeRequestBody query + from + size + sort + "package" + "package_attr_name" + [ "package_attr_name_query" + , "package_pname" + , "package_description" + ] + should_queries + ) ("latest-" ++ String.fromInt options.mappingSchemaVersion ++ "-" ++ channel) decodeResultItemSource options diff --git a/src/Search.elm b/src/Search.elm index 12e552a..de06e2f 100644 --- a/src/Search.elm +++ b/src/Search.elm @@ -734,8 +734,11 @@ filter_by_type type_ = ) -filter_by_query : String -> String -> List (List ( String, Json.Encode.Value )) -filter_by_query field queryRaw = +filter_by_query : + List String + -> String + -> List (List ( String, Json.Encode.Value )) +filter_by_query fields queryRaw = let query = queryRaw @@ -750,55 +753,64 @@ filter_by_query field queryRaw = isLast = List.length (String.words query) == i + 1 in - [ if isLast then - ( "bool" - , Json.Encode.object - [ ( "should" - , Json.Encode.list Json.Encode.object - [ [ ( "match" - , Json.Encode.object - [ ( field - , Json.Encode.object - [ ( "query", Json.Encode.string query_word ) - , ( "fuzziness", Json.Encode.string "1" ) - , ( "_name", Json.Encode.string <| "filter_queries_" ++ String.fromInt (i + 1) ++ "_should_match" ) - ] - ) - ] + if isLast then + [ ( "bool" + , Json.Encode.object + [ ( "should" + , Json.Encode.list Json.Encode.object + (List.concatMap + (\field -> + [ [ ( "match" + , Json.Encode.object + [ ( field + , Json.Encode.object + [ ( "query", Json.Encode.string query_word ) + , ( "fuzziness", Json.Encode.string "1" ) + , ( "_name", Json.Encode.string <| "filter_queries_" ++ String.fromInt (i + 1) ++ "_should_match" ) + ] + ) + ] + ) + ] + , [ ( "match_bool_prefix" + , Json.Encode.object + [ ( field + , Json.Encode.object + [ ( "query", Json.Encode.string query_word ) + , ( "_name" + , Json.Encode.string <| "filter_queries_" ++ String.fromInt (i + 1) ++ "_should_prefix" + ) + ] + ) + ] + ) + ] + ] + ) + fields ) - ] - , [ ( "match_bool_prefix" - , Json.Encode.object - [ ( field - , Json.Encode.object - [ ( "query", Json.Encode.string query_word ) - , ( "_name" - , Json.Encode.string <| "filter_queries_" ++ String.fromInt (i + 1) ++ "_should_prefix" - ) - ] - ) - ] - ) - ] - ] - ) - ] - ) + ) + ] + ) + ] - else - ( "match_bool_prefix" - , Json.Encode.object - [ ( field - , Json.Encode.object - [ ( "query", Json.Encode.string query_word ) - , ( "_name" - , Json.Encode.string <| "filter_queries_" ++ String.fromInt (i + 1) ++ "_prefix" + else + List.map + (\field -> + ( "match_bool_prefix" + , Json.Encode.object + [ ( field + , Json.Encode.object + [ ( "query", Json.Encode.string query_word ) + , ( "_name" + , Json.Encode.string <| "filter_queries_" ++ String.fromInt (i + 1) ++ "_prefix" + ) + ] ) ] - ) - ] - ) - ] + ) + ) + fields ) @@ -809,10 +821,10 @@ makeRequestBody : -> Sort -> String -> String - -> String + -> List String -> List (List ( String, Json.Encode.Value )) -> Http.Body -makeRequestBody query from sizeRaw sort type_ sort_field query_field should_queries = +makeRequestBody query from sizeRaw sort type_ sort_field query_fields should_queries = let -- you can not request more then 10000 results otherwise it will return 404 size = @@ -839,7 +851,7 @@ makeRequestBody query from sizeRaw sort type_ sort_field query_field should_quer , Json.Encode.list Json.Encode.object (List.append [ [ filter_by_type type_ ] ] - (filter_by_query query_field query) + (filter_by_query query_fields query) ) ) , ( "should"