From 91527f1deb18e3f74b6e52c50cadc08b4366e4f2 Mon Sep 17 00:00:00 2001 From: Rok Garbas Date: Fri, 21 Aug 2020 21:23:21 +0200 Subject: [PATCH] space should present an OR operation in query (#150) filtering part of the query was messed up when I added search over multiple fields. fixes #147 fixes #149 --- src/Page/Options.elm | 4 +- src/Search.elm | 115 ++++++++++++++++++------------------------- 2 files changed, 51 insertions(+), 68 deletions(-) diff --git a/src/Page/Options.elm b/src/Page/Options.elm index 74be486..b6441ae 100644 --- a/src/Page/Options.elm +++ b/src/Page/Options.elm @@ -165,8 +165,8 @@ viewResultItem channel show item = -- DEBUG: |> List.append -- DEBUG: [ tr [] -- DEBUG: [ td [ colspan 1 ] - -- DEBUG: [ p [] [ text <| "score: " ++ String.fromFloat item.score ] - -- DEBUG: , p [] + -- DEBUG: [ div [] [ text <| "score: " ++ String.fromFloat (Maybe.withDefault 0 item.score) ] + -- DEBUG: , div [] -- DEBUG: [ text <| -- DEBUG: "matched queries: " -- DEBUG: , ul [] diff --git a/src/Search.elm b/src/Search.elm index de06e2f..b563559 100644 --- a/src/Search.elm +++ b/src/Search.elm @@ -737,81 +737,65 @@ filter_by_type type_ = filter_by_query : List String -> String - -> List (List ( String, Json.Encode.Value )) + -> ( String, Json.Encode.Value ) filter_by_query fields queryRaw = let query = queryRaw |> String.trim in - query - |> String.replace "." " " - |> String.words - |> List.indexedMap - (\i query_word -> - let - isLast = - List.length (String.words query) == i + 1 - in - 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" + ( "bool" + , Json.Encode.object + [ ( "should" + , Json.Encode.list Json.Encode.object + (query + |> String.words + |> List.indexedMap + (\i query_word -> + [ ( "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 ++ "_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 - ) + fields + ) + ) + ] ) ] - ) - ] - - 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 - ) + ) + ) + ] + ) makeRequestBody : @@ -849,10 +833,9 @@ makeRequestBody query from sizeRaw sort type_ sort_field query_fields should_que , Json.Encode.object [ ( "filter" , Json.Encode.list Json.Encode.object - (List.append - [ [ filter_by_type type_ ] ] - (filter_by_query query_fields query) - ) + [ [ filter_by_type type_ ] + , [ filter_by_query query_fields query ] + ] ) , ( "should" , Json.Encode.list Json.Encode.object should_queries