nrtsearch
nrtsearch copied to clipboard
Create runtime fields
The following query works now. It supports all the numeric values, strings, maps and lists.
{
"indexName": "testRuntime",
"startHit": 0,
"topHits": 5,
"retrieveFields": [
"vendor_name",
"license_no",
"v1",
"r1",
"r2",
"r3",
"r4",
"r5",
"r6"
],
"runtimeFields": [
{
"name": "r1",
"script": {
"lang": "painless",
"source": "return Collections.singletonMap('key', 2.5);"
}
},
{
"name": "r2",
"script": {
"lang": "painless",
"source": "return false;"
}
},
{
"name": "r3",
"script": {
"lang": "painless",
"source": "Map map = Collections.singletonMap('internalKey', 2.5); return Collections.singletonMap('key', map);"
}
},
{
"name": "r4",
"script": {
"lang": "painless",
"source": "List nums = new ArrayList(); nums.add('1'); nums.add('2'); return nums;"
}
},
{
"name": "r5",
"script": {
"lang": "painless",
"source": "List nums = new ArrayList(); nums.add(1); nums.add(2); return nums;"
}
},
{
"name": "r6",
"script": {
"lang": "painless",
"source": "Map map = Collections.singletonMap('key', 2.5); List maps = new ArrayList(); maps.add(map); maps.add(map); return maps;"
}
}
],
"virtualFields": [
{
"name": "v1",
"script": {
"lang": "painless",
"source": "return 2 * 4.0;"
}
}
]
}
Which gave me the following:
[INFO ] 2024-03-18 15:49:57.012 [main] LuceneServerClientBuilder$SearchClientBuilder - Converting fields {
"indexName": "testRuntime",
"startHit": 0,
"topHits": 5,
"retrieveFields": [
"vendor_name",
"license_no",
"v1",
"r1",
"r2",
"r3",
"r4",
"r5",
"r6"
],
"runtimeFields": [
{
"name": "r1",
"script": {
"lang": "painless",
"source": "return Collections.singletonMap('key', 2.5);"
}
},
{
"name": "r2",
"script": {
"lang": "painless",
"source": "return false;"
}
},
{
"name": "r3",
"script": {
"lang": "painless",
"source": "Map map = Collections.singletonMap('internalKey', 2.5); return Collections.singletonMap('key', map);"
}
},
{
"name": "r4",
"script": {
"lang": "painless",
"source": "List nums = new ArrayList(); nums.add('1'); nums.add('2'); return nums;"
}
},
{
"name": "r5",
"script": {
"lang": "painless",
"source": "List nums = new ArrayList(); nums.add(1); nums.add(2); return nums;"
}
},
{
"name": "r6",
"script": {
"lang": "painless",
"source": "Map map = Collections.singletonMap('key', 2.5); List maps = new ArrayList(); maps.add(map); maps.add(map); return maps;"
}
}
],
"virtualFields": [
{
"name": "v1",
"script": {
"lang": "painless",
"source": "return 2 * 4.0;"
}
}
]
}
to proto SearchRequest
[INFO ] 2024-03-18 15:49:57.093 [main] LuceneServerClientBuilder$SearchClientBuilder - jsonStr converted to proto SearchRequest:
indexName: "testRuntime"
topHits: 5
retrieveFields: "vendor_name"
retrieveFields: "license_no"
retrieveFields: "v1"
retrieveFields: "r1"
retrieveFields: "r2"
retrieveFields: "r3"
retrieveFields: "r4"
retrieveFields: "r5"
retrieveFields: "r6"
virtualFields {
script {
lang: "painless"
source: "return 2 * 4.0;"
}
name: "v1"
}
runtimeFields {
script {
lang: "painless"
source: "return Collections.singletonMap(\'key\', 2.5);"
}
name: "r1"
}
runtimeFields {
script {
lang: "painless"
source: "return false;"
}
name: "r2"
}
runtimeFields {
script {
lang: "painless"
source: "Map map = Collections.singletonMap(\'internalKey\', 2.5); return Collections.singletonMap(\'key\', map);"
}
name: "r3"
}
runtimeFields {
script {
lang: "painless"
source: "List nums = new ArrayList(); nums.add(\'1\'); nums.add(\'2\'); return nums;"
}
name: "r4"
}
runtimeFields {
script {
lang: "painless"
source: "List nums = new ArrayList(); nums.add(1); nums.add(2); return nums;"
}
name: "r5"
}
runtimeFields {
script {
lang: "painless"
source: "Map map = Collections.singletonMap(\'key\', 2.5); List maps = new ArrayList(); maps.add(map); maps.add(map); return maps;"
}
name: "r6"
}
[INFO ] 2024-03-18 15:49:57.219 [main] LuceneServerClient - Server returned : diagnostics {
firstPassSearchTimeMs: 1.395666
getFieldsTimeMs: 7.184209
}
totalHits {
value: 2
}
hits {
score: 1.0
fields {
key: "license_no"
value {
fieldValue {
intValue: 100
}
fieldValue {
intValue: 200
}
}
}
fields {
key: "r1"
value {
fieldValue {
structValue {
fields {
key: "key"
value {
number_value: 2.5
}
}
}
}
}
}
fields {
key: "r2"
value {
fieldValue {
booleanValue: false
}
}
}
fields {
key: "r3"
value {
fieldValue {
structValue {
fields {
key: "key"
value {
struct_value {
fields {
key: "internalKey"
value {
number_value: 2.5
}
}
}
}
}
}
}
}
}
fields {
key: "r4"
value {
fieldValue {
repeatedFieldValues {
textValues: "1"
textValues: "2"
}
}
}
}
fields {
key: "r5"
value {
fieldValue {
repeatedFieldValues {
intValues: 1
intValues: 2
}
}
}
}
fields {
key: "r6"
value {
fieldValue {
repeatedFieldValues {
structValues {
fields {
key: "key"
value {
number_value: 2.5
}
}
}
structValues {
fields {
key: "key"
value {
number_value: 2.5
}
}
}
}
}
}
}
fields {
key: "v1"
value {
fieldValue {
doubleValue: 8.0
}
}
}
fields {
key: "vendor_name"
value {
fieldValue {
textValue: "first vendor"
}
}
}
}
hits {
luceneDocId: 1
score: 1.0
fields {
key: "license_no"
value {
fieldValue {
intValue: 111
}
fieldValue {
intValue: 222
}
}
}
fields {
key: "r1"
value {
fieldValue {
structValue {
fields {
key: "key"
value {
number_value: 2.5
}
}
}
}
}
}
fields {
key: "r2"
value {
fieldValue {
booleanValue: false
}
}
}
fields {
key: "r3"
value {
fieldValue {
structValue {
fields {
key: "key"
value {
struct_value {
fields {
key: "internalKey"
value {
number_value: 2.5
}
}
}
}
}
}
}
}
}
fields {
key: "r4"
value {
fieldValue {
repeatedFieldValues {
textValues: "1"
textValues: "2"
}
}
}
}
fields {
key: "r5"
value {
fieldValue {
repeatedFieldValues {
intValues: 1
intValues: 2
}
}
}
}
fields {
key: "r6"
value {
fieldValue {
repeatedFieldValues {
structValues {
fields {
key: "key"
value {
number_value: 2.5
}
}
}
structValues {
fields {
key: "key"
value {
number_value: 2.5
}
}
}
}
}
}
}
fields {
key: "v1"
value {
fieldValue {
doubleValue: 8.0
}
}
}
fields {
key: "vendor_name"
value {
fieldValue {
textValue: "second vendor"
}
}
}
}
searchState {
timestamp: 1710802197
searcherVersion: 4
lastDocId: 1
lastScore: 1.0
}
@aprudhomme thank you for reviewing this. I applied your suggestions. Can you please take a look at this to see if the overall design is good enough so that I can create tests for this PR? I will try to support map and list types with the test commit .
@aprudhomme can you please take a look at this? I think the failing tests are flaky ones that don't have anything to do with my changes. I
@aprudhomme can you take a look at this when you get a chance?