@@ -11,7 +11,6 @@ a function to be used to compute a new score for each document returned
11
11
by the query. For more information on scripting see
12
12
<<modules-scripting, scripting documentation>>.
13
13
14
-
15
14
Here is an example of using `script_score` to assign each matched document
16
15
a score equal to the number of likes divided by 10:
17
16
@@ -31,8 +30,7 @@ GET /_search
31
30
}
32
31
}
33
32
--------------------------------------------------
34
- // CONSOLE
35
- // TEST[setup:twitter]
33
+ // NOTCONSOLE
36
34
37
35
NOTE: The values returned from `script_score` cannot be negative. In general,
38
36
Lucene requires the scores produced by queries to be non-negative in order to
@@ -97,6 +95,40 @@ cosine similarity between a given query vector and document vectors.
97
95
98
96
[source,js]
99
97
--------------------------------------------------
98
+ PUT my_index
99
+ {
100
+ "mappings": {
101
+ "properties": {
102
+ "my_dense_vector": {
103
+ "type": "dense_vector",
104
+ "dims": 3
105
+ },
106
+ "my_sparse_vector" : {
107
+ "type" : "sparse_vector"
108
+ }
109
+ }
110
+ }
111
+ }
112
+
113
+ PUT my_index/_doc/1
114
+ {
115
+ "my_dense_vector": [0.5, 10, 6],
116
+ "my_sparse_vector": {"2": 1.5, "15" : 2, "50": -1.1, "4545": 1.1}
117
+ }
118
+
119
+ PUT my_index/_doc/2
120
+ {
121
+ "my_dense_vector": [-0.5, 10, 10],
122
+ "my_sparse_vector": {"2": 2.5, "10" : 1.3, "55": -2.3, "113": 1.6}
123
+ }
124
+
125
+ --------------------------------------------------
126
+ // CONSOLE
127
+ // TESTSETUP
128
+
129
+ [source,js]
130
+ --------------------------------------------------
131
+ GET my_index/_search
100
132
{
101
133
"query": {
102
134
"script_score": {
@@ -113,7 +145,7 @@ cosine similarity between a given query vector and document vectors.
113
145
}
114
146
}
115
147
--------------------------------------------------
116
- // NOTCONSOLE
148
+ // CONSOLE
117
149
<1> The script adds 1.0 to the cosine similarity to prevent the score from being negative.
118
150
<2> To take advantage of the script optimizations, provide a query vector as a script parameter.
119
151
@@ -122,6 +154,7 @@ between a given query vector and document vectors.
122
154
123
155
[source,js]
124
156
--------------------------------------------------
157
+ GET my_index/_search
125
158
{
126
159
"query": {
127
160
"script_score": {
@@ -138,13 +171,14 @@ between a given query vector and document vectors.
138
171
}
139
172
}
140
173
--------------------------------------------------
141
- // NOTCONSOLE
174
+ // CONSOLE
142
175
143
176
For dense_vector fields, `dotProduct` calculates the measure of
144
177
dot product between a given query vector and document vectors.
145
178
146
179
[source,js]
147
180
--------------------------------------------------
181
+ GET my_index/_search
148
182
{
149
183
"query": {
150
184
"script_score": {
@@ -153,7 +187,7 @@ dot product between a given query vector and document vectors.
153
187
},
154
188
"script": {
155
189
"source": """
156
- double value = dotProduct(params.query_vector, doc['my_vector ']);
190
+ double value = dotProduct(params.query_vector, doc['my_dense_vector ']);
157
191
return sigmoid(1, Math.E, -value); <1>
158
192
""",
159
193
"params": {
@@ -164,7 +198,7 @@ dot product between a given query vector and document vectors.
164
198
}
165
199
}
166
200
--------------------------------------------------
167
- // NOTCONSOLE
201
+ // CONSOLE
168
202
169
203
<1> Using the standard sigmoid function prevents scores from being negative.
170
204
@@ -173,6 +207,7 @@ between a given query vector and document vectors.
173
207
174
208
[source,js]
175
209
--------------------------------------------------
210
+ GET my_index/_search
176
211
{
177
212
"query": {
178
213
"script_score": {
@@ -192,8 +227,118 @@ between a given query vector and document vectors.
192
227
}
193
228
}
194
229
--------------------------------------------------
230
+ // CONSOLE
231
+
232
+ For dense_vector fields, `l1norm` calculates L^1^ distance
233
+ (Manhattan distance) between a given query vector and
234
+ document vectors.
235
+
236
+ [source,js]
237
+ --------------------------------------------------
238
+ GET my_index/_search
239
+ {
240
+ "query": {
241
+ "script_score": {
242
+ "query": {
243
+ "match_all": {}
244
+ },
245
+ "script": {
246
+ "source": "l1norm(params.queryVector, doc['my_dense_vector'])",
247
+ "params": {
248
+ "queryVector": [4, 3.4, -0.2]
249
+ }
250
+ }
251
+ }
252
+ }
253
+ }
254
+ --------------------------------------------------
255
+ // CONSOLE
256
+
257
+ NOTE: Unlike `cosineSimilarity` that represent similarity, `l1norm` and
258
+ `l2norm` shown below represent distances or differences. This means, that
259
+ the more similar are the vectors, the less will be the scores produced by the
260
+ `l1norm` and `l2norm` functions. Thus, if you need more similar vectors to
261
+ score higher, you should reverse the output from `l1norm` and `l2norm`:
262
+
263
+ [source,js]
264
+ --------------------------------------------------
265
+ "source": " 1/ l1norm(params.queryVector, doc['my_dense_vector'])"
266
+ --------------------------------------------------
195
267
// NOTCONSOLE
196
268
269
+ For sparse_vector fields, `l1normSparse` calculates L^1^ distance
270
+ between a given query vector and document vectors.
271
+
272
+ [source,js]
273
+ --------------------------------------------------
274
+ GET my_index/_search
275
+ {
276
+ "query": {
277
+ "script_score": {
278
+ "query": {
279
+ "match_all": {}
280
+ },
281
+ "script": {
282
+ "source": "l1normSparse(params.queryVector, doc['my_sparse_vector'])",
283
+ "params": {
284
+ "queryVector": {"2": 0.5, "10" : 111.3, "50": -1.3, "113": 14.8, "4545": 156.0}
285
+ }
286
+ }
287
+ }
288
+ }
289
+ }
290
+ --------------------------------------------------
291
+ // CONSOLE
292
+
293
+ For dense_vector fields, `l2norm` calculates L^2^ distance
294
+ (Euclidean distance) between a given query vector and
295
+ document vectors.
296
+
297
+ [source,js]
298
+ --------------------------------------------------
299
+ GET my_index/_search
300
+ {
301
+ "query": {
302
+ "script_score": {
303
+ "query": {
304
+ "match_all": {}
305
+ },
306
+ "script": {
307
+ "source": "l2norm(params.queryVector, doc['my_dense_vector'])",
308
+ "params": {
309
+ "queryVector": [4, 3.4, -0.2]
310
+ }
311
+ }
312
+ }
313
+ }
314
+ }
315
+ --------------------------------------------------
316
+ // CONSOLE
317
+
318
+ Similarly, for sparse_vector fields, `l2normSparse` calculates L^2^ distance
319
+ between a given query vector and document vectors.
320
+
321
+ [source,js]
322
+ --------------------------------------------------
323
+ GET my_index/_search
324
+ {
325
+ "query": {
326
+ "script_score": {
327
+ "query": {
328
+ "match_all": {}
329
+ },
330
+ "script": {
331
+ "source": "l2normSparse(params.queryVector, doc['my_sparse_vector'])",
332
+ "params": {
333
+ "queryVector": {"2": 0.5, "10" : 111.3, "50": -1.3, "113": 14.8, "4545": 156.0}
334
+ }
335
+ }
336
+ }
337
+ }
338
+ }
339
+ --------------------------------------------------
340
+ // CONSOLE
341
+
197
342
NOTE: If a document doesn't have a value for a vector field on which
198
343
a vector function is executed, an error will be thrown.
199
344
0 commit comments