@@ -79,6 +79,7 @@ import Http
79
79
import Json.Decode
80
80
import Json.Decode.Pipeline
81
81
import Json.Encode
82
+ import List.Extra
82
83
import RemoteData
83
84
import Route
84
85
exposing
@@ -87,7 +88,6 @@ import Route
87
88
, searchTypeToTitle
88
89
)
89
90
import Route.SearchQuery
90
- import Set
91
91
import Task
92
92
93
93
@@ -1245,12 +1245,13 @@ filterByType type_ =
1245
1245
1246
1246
1247
1247
searchFields :
1248
- String
1248
+ List String
1249
1249
-> String
1250
1250
-> List ( String , Float )
1251
1251
-> List ( List ( String , Json . Encode . Value ))
1252
- searchFields query mainField fields =
1252
+ searchFields positiveWords mainField fields =
1253
1253
let
1254
+ allFields : List String
1254
1255
allFields =
1255
1256
fields
1256
1257
|> List . concatMap
@@ -1260,44 +1261,28 @@ searchFields query mainField fields =
1260
1261
]
1261
1262
)
1262
1263
1264
+ queryWordsWildCard : List String
1263
1265
queryWordsWildCard =
1264
- ( String . replace " _ " " - " query :: String . replace " - " " _ " query :: queryWords )
1265
- |> Set . fromList
1266
- |> Set . toList
1266
+ positiveWords
1267
+ |> List . concatMap dashUnderscoreVariants
1268
+ |> List . Extra . unique
1267
1269
1268
- queryWords =
1269
- String . words ( String . toLower query)
1270
+ multiMatch : List ( String , Json . Encode . Value )
1271
+ multiMatch =
1272
+ [ ( " multi_match"
1273
+ , Json . Encode . object
1274
+ [ ( " type" , Json . Encode . string " cross_fields" )
1275
+ , ( " query" , Json . Encode . string ( String . join " " positiveWords) )
1276
+ , ( " analyzer" , Json . Encode . string " whitespace" )
1277
+ , ( " auto_generate_synonyms_phrase_query" , Json . Encode . bool False )
1278
+ , ( " operator" , Json . Encode . string " and" )
1279
+ , ( " _name" , Json . Encode . string <| " multi_match_" ++ String . join " _" positiveWords )
1280
+ , ( " fields" , Json . Encode . list Json . Encode . string allFields )
1281
+ ]
1282
+ )
1283
+ ]
1270
1284
in
1271
- List . append
1272
- [ [ ( " multi_match"
1273
- , Json . Encode . object
1274
- [ ( " type" , Json . Encode . string " cross_fields" )
1275
- , ( " query" , Json . Encode . string <| String . join " " queryWords )
1276
- , ( " analyzer" , Json . Encode . string " whitespace" )
1277
- , ( " auto_generate_synonyms_phrase_query" , Json . Encode . bool False )
1278
- , ( " operator" , Json . Encode . string " and" )
1279
- , ( " _name" , Json . Encode . string <| " multi_match_" ++ String . join " _" queryWords )
1280
- , ( " fields" , Json . Encode . list Json . Encode . string allFields )
1281
- ]
1282
- )
1283
- ]
1284
- ]
1285
- ( List . map
1286
- ( \ queryWord ->
1287
- [ ( " wildcard"
1288
- , Json . Encode . object
1289
- [ ( mainField
1290
- , Json . Encode . object
1291
- [ ( " value" , Json . Encode . string ( " *" ++ queryWord ++ " *" ) )
1292
- , ( " case_insensitive" , Json . Encode . bool True )
1293
- ]
1294
- )
1295
- ]
1296
- )
1297
- ]
1298
- )
1299
- queryWordsWildCard
1300
- )
1285
+ multiMatch :: List . map ( toWildcardQuery mainField) queryWordsWildCard
1301
1286
1302
1287
1303
1288
makeRequestBody :
@@ -1322,6 +1307,12 @@ makeRequestBody query from sizeRaw sort type_ sortField otherSortFields bucketsF
1322
1307
1323
1308
else
1324
1309
sizeRaw
1310
+
1311
+ ( negativeWords, positiveWords ) =
1312
+ String . toLower query
1313
+ |> String . words
1314
+ |> List . partition ( String . startsWith " -" )
1315
+ |> Tuple . mapFirst ( List . map ( String . dropLeft 1 ))
1325
1316
in
1326
1317
Http . jsonBody
1327
1318
( Json . Encode . object
@@ -1349,14 +1340,22 @@ makeRequestBody query from sizeRaw sort type_ sortField otherSortFields bucketsF
1349
1340
)
1350
1341
)
1351
1342
)
1343
+ , ( " must_not"
1344
+ , Json . Encode . list Json . Encode . object
1345
+ ( negativeWords
1346
+ |> List . concatMap dashUnderscoreVariants
1347
+ |> List . Extra . unique
1348
+ |> List . map ( toWildcardQuery mainField)
1349
+ )
1350
+ )
1352
1351
, ( " must"
1353
1352
, Json . Encode . list Json . Encode . object
1354
1353
[ [ ( " dis_max"
1355
1354
, Json . Encode . object
1356
1355
[ ( " tie_breaker" , Json . Encode . float 0.7 )
1357
1356
, ( " queries"
1358
1357
, Json . Encode . list Json . Encode . object
1359
- ( searchFields query mainField fields)
1358
+ ( searchFields positiveWords mainField fields)
1360
1359
)
1361
1360
]
1362
1361
)
@@ -1371,6 +1370,31 @@ makeRequestBody query from sizeRaw sort type_ sortField otherSortFields bucketsF
1371
1370
)
1372
1371
1373
1372
1373
+ {- | Given a word, returns all variants of replacing underscores and dashes with each other.
1374
+ -}
1375
+ dashUnderscoreVariants : String -> List String
1376
+ dashUnderscoreVariants word =
1377
+ [ String . replace " _" " -" word
1378
+ , String . replace " -" " _" word
1379
+ , word
1380
+ ]
1381
+
1382
+
1383
+ toWildcardQuery : String -> String -> List ( String , Json .Encode .Value )
1384
+ toWildcardQuery mainField queryWord =
1385
+ [ ( " wildcard"
1386
+ , Json . Encode . object
1387
+ [ ( mainField
1388
+ , Json . Encode . object
1389
+ [ ( " value" , Json . Encode . string ( " *" ++ queryWord ++ " *" ) )
1390
+ , ( " case_insensitive" , Json . Encode . bool True )
1391
+ ]
1392
+ )
1393
+ ]
1394
+ )
1395
+ ]
1396
+
1397
+
1374
1398
makeRequest :
1375
1399
Http . Body
1376
1400
-> List NixOSChannel
0 commit comments