Is it possible to apply a solr document int field

2019-03-06 00:24发布

问题:

Ex. 

"docs": [
{
"id": "f37914",
"index_id": "some_index",
"field_1": [
   {
      "Some value",
      "boost": 20.
   }
 ]
},
]

If 'field_1' is matched, then boost by corresponding 'boost' field.

回答1:

Boost what? the document? the specific field? you can do any of them. Anyway the way to do it is to user Function Queries: https://lucene.apache.org/solr/guide/6_6/function-queries.html#FunctionQueries-AvailableFunctions

For example if you want to boost the document (and assuming if the value doesn't match then the score is 0) then you can do something like that:

q:_val_:"if(query($q1), field(boost), 0)"&q1=field_1:"Some Value"

_val_ is just a hook into Solr function query, query returns true if q1 matches, field is a simple function that just return the value of the field it self and if allows us to join the two together.



回答2:

So what I ended up doing is using lucence payloads and solr 6.6 new DelimitedPayloadTokenFilter feature.

First I created a terms field with the following configuration:

{
 "add-field-type": {
   "name": "terms",
   "stored": "true",
   "class": "solr.TextField",
   "positionIncrementGap": "100",
   "indexAnalyzer": {
     "tokenizer": {
       "class": "solr.KeywordTokenizerFactory"
     },
     "filters": [
       {
         "class": "solr.LowerCaseFilterFactory"
       },
       {
         "class": "solr.DelimitedPayloadTokenFilterFactory",
         "encoder": "float",
         "delimiter": "|"
       }
     ]
   },
   "queryAnalyzer": {
     "tokenizer": {
       "class": "solr.KeywordTokenizerFactory"
     },
     "filters": [
       {
         "class": "solr.LowerCaseFilterFactory"
       },
       {
         "class": "solr.SynonymGraphFilterFactory",
         "ignoreCase": "true",
         "expand": "false",
         "tokenizerFactory": "solr.KeywordTokenizerFactory",
         "synonyms": "synonyms.txt"
       }
     ]
   }
 },

 "add-field" : {
   "name":"terms",
   "type":"terms",
   "stored": "true",
   "multiValued": "true"
 }
}

I indexed my documents likes so:

[
  {
    "id" : "1",
    "terms" : [
      "some term|10.0",
      "another term|60.0"
    ]
  }
,
   {
    "id" : "2",
    "terms" : [
      "some term|11.0",
      "another term|21.0"
    ]
  }
]

I used solr's functional query support to query for a match on terms and grab the attached boost payload and apply it to the relevancy score:

/solr/payloads/select?indent=on&wt=json&q={!payload_score%20f=ai_terms_wtih_synm_3%20v=$payload_term%20func=max}&fl=id,score&payload_term=some+term


标签: solr