Is there a way to call one custom request handler from another in Solr. eg : i have /myhandler1 and /myhandler2 defined as custom request handlers in the solrconfig.xml. Defined like this
<requestHandler name="/my handler1" class="solr.CSVRequestHandler">
<lst name="defaults">
<str name="update.chain">mylogupdate</str>
<str name="stream.contentType">application/csv</str>
</lst>
</requestHandler>
and
<requestHandler name="/myhandler2" class="solr.CSVRequestHandler">
<lst name="defaults">
<str name="update.chain">mylogupdate</str>
<str name="stream.contentType">application/csv</str>
</lst>
</requestHandler>
is there a way to call /myhandler2 from /myhandler1. basically i want to use handler 1 to do some processing and then redirect it to another handler to do a second task.
the larger problem is this:
given a line like this ,
2012-01-04 23:11:41,450 AltQ:RCR-TRP: 101863261
i can split this on a comma separator and get two fields. i further want the second field to be split on a space separator and i want to store these values to different fields
like
val1:450
val2: altQ:RCR-TRP:
val3:101863261
and so on...
For the benefit of the ppl .. I still haven't found a way to redirect requests handlers..but the other problem however was solved . I found a work around to it by defining my own custom processor < that extends update request processor >
http://wiki.apache.org/solr/UpdateRequestProcessor#Processor_Customization_Examples
and i used JAVA to manipulate the document !
Related
We've got a multilingual search index with the "field-per-language" configuration with a lot of similar aliases in the search handler like this:
<str name="f.content_en.qf">Title_en^10 Text_en^1 ...</str>
<str name="f.content_de.qf">Title_de^10 Text_de^1 ...</str>
...
They are used in the q parameter:
<str name="q">{!edismax qf=$searchField pf=$searchField v=$searchText}</str>
The client knows, which language should be used and calls Solr like this, e.g.: /solr/core/search?searchText=TEXT&searchField=content_en
That works fine, but the configuration contains a lot of similar stuff.
I'd like to optimize the config to something like this:
<str name="df">content</str>
<str name="f.content.qf">Title_${lang}^10 Text_${lang}^1...</str>
Then the client would need to provide the lang parameter only.
I tried to use concat function like this:
paramLang=en
searchFields=concat("Title", "_", "${paramLang}", " ", "Text", "_", "${paramLang}")
and use it as the qf:
q={!edismax qf=$searchFields v=$searchText}
But it seems, the local params qf does not support Solr functions.
Is is possible with Solr at all?
Actually, the Parameter substitution / Macro Expansion works fine.
The issue was with those macros in the solrconfig.xml: there is a conflict with Solr system properties substitution. Solr could not resolve the query parameter macros.
I could not find a proper way, how to escape query parameters (macros) and used the following workaround:
<lst name="invariants">
<str name="defType">edismax</str>
<str name="searchFields">
Title_${lang:${lang}}^10
Text_${lang:${lang}}^1
...
<lst name="defaults">
<str name="q">*</str>
<str name="qf">${searchFields:${searchFields}}</str>
<str name="pf">${searchFields:${searchFields}}</str>
<str name="lang">en</str>
...
Query URL: /search?q=TEXT&lang=en
Update: proper way to deal with var substitution in solrconfig.xml - escape the dollar char by $$:
<str name="searchFields">
Title_$${lang}^10
Text_$${lang}^1
...
Update #2: do NOT define macros in the invariant or append sections when using a Solr Cloud! Otherwise, you'll a weird exception, e.g.:
"undefined field: \"Text_$\"
or
"msg": "Error from server at null: org.apache.solr.search.SyntaxError: Query Field '${searchFields}' is not a valid field name"
P.S. wt=json as "invariant" is also NOT compatible with Solr Cloud, giving "unexpected" content-type error.
So many "surprises" :(
This is newbie question, but trying understand solr search handler with defaults enabled.
As per my understanding df is used for Default search field, what will happen/how does it work if remove this part?
My scenario currently: I am pushing/adding all fields data (e.g title, department, etc.) to text. So when I search free text it can be searchable (using edismax) and it works as expected. But when tomorrow new fields come, I mean suppose it will be title, department , somefield, then I have to reindex all data again. Then it will be searchable. How can I achieve that? Can I have multiple fields in df?
example : <str name="df">title, department, etc,etc </str> like this ?
<requestHandler name="/select" class="solr.SearchHandler">
<!-- default values for query parameters can be specified, these
will be overridden by parameters in the request
-->
<lst name="defaults">
<str name="echoParams">explicit</str>
<int name="rows">10</int>
<!-- Default search field -->
<str name="df">text</str>
</lst>
Since you're using edismax, you can provide the qf argument with multiple fields instead - and weights between them. Another option is to have one common field, i.e. something like text and a copyField instruction that copies everything (source set to *) to text (dest set to text), then search against that field.
Using either won't require a reindex, since the content will either be copied from all documents indexed as they're being indexed, or the search will consider more fields (with qf).
You can set the default value for the qf in the same was a you've shown above in the config file under defaults.
I need to perform highlighting for multiple words into the same field but for each one using a specific formatter (prefix and postfix).
Let's say that I have the description field and for a document it has the value: Einstein always excelled at math and physics from a young age. How to highlight math with a pair of a specific prefix and postfix AND ALSO physicswith a different prefix-postfix pair? So, in the end I would like to obtain:
Einstein always excelled at <em class="hl-red">math</em> and <em class="hl-green">physics</em> from a young age
The reason is that in the frontend I have different CSS classes with background-color: red; for hl-red and background-color: green for hl-green for example.
However, I was managed to highlight multiple words into the same field but with the same prefix-postfix pair all over the places, which is not what I want actually. In addition, I tried to add multiple HtmlFormatter entries in solrconfig.xml:
<highlighting>
..............
<formatter name="html" default="true" class="solr.highlight.HtmlFormatter">
<lst name="defaults">
<str name="hl.simple.pre"><![CDATA[<em>]]></str>
<str name="hl.simple.post"><![CDATA[</em>]]></str>
</lst>
<lst name="hl-red">
<str name="hl.simple.pre"><![CDATA[<em class="hl-red">]]></str>
<str name="hl.simple.post"><![CDATA[</em>]]></str>
</lst>
<lst name="hl-green">
<str name="hl.simple.pre"><![CDATA[<em class="hl-green">]]></str>
<str name="hl.simple.post"><![CDATA[</em>]]></str>
</lst>
</formatter>
..............
</highlighting>
but I got HttpSolrClient$RemoteSolrException: Error from server at http://localhost:8983/solr: Unknown formatter: hl-green. Also, I didn't find a way to specify an array of prefixes in Solr Admin UI nor in spring-data-solr, just a simple query like this:
SimpleHighlightQuery query = new SimpleHighlightQuery(Objects.requireNonNull(criteria));
HighlightOptions highlightOptions = new HighlightOptions()
.addFields(fields)
.setSimplePrefix(prefix)
.setSimplePostfix(postfix);
query.setHighlightOptions(highlightOptions);
query.setPageRequest(pageable);
return solrTemplate.queryForHighlightPage(MY_CORE, query, MyModel.class);
My assumption is that it is a limitation of the Solr itself.
I was thinking about to write a custom fragmentsBuilder but I do not know exactly if it is the case nor how to do that. For another workaround I was thinking to execute for each word a highlight query, then to store the result, then to execute for the second word another highlight query, store the result and so on. But I don't think it is a good and elegant solution because I will have problems when executing the second query if the second word is: "em" or "class" or "red"/"green" (nested undesired highlighting will occur).
I am using spring-data-solr into a Spring Boot application and Solr 6.6.5 as a (http) service.
Does anyone know how to solve this? Please give me an advice! Any idea will be much appreciated!
This is my first question at stackoverflow so apologies in advance if I break any rules but I did study them and also made sure this isn't a duplicate question.
So, according to this http://yonik.com/solr-query-parameter-substitution/ one can set up a search handler in solrconfig in a way that the
request handler defaults, appends, and invariants configured for the
handler may reference request parameters
I have the following query which works just fine with curl
curl http://localhost:7997/solr/vb_popbio/select -d 'q=*:*&fq=bundle:pop_sample_phenotype AND phenotype_type_s:"insecticide%20resistance"
&rows=0&wt=json&json.nl=map&indent=true
&fq=phenotype_value_type_s:${PFIELD}&
&PGAP=5&PSTART=0&PEND=101&PFIELD="mortality rate"&
json.facet = {
pmean: "avg(phenotype_value_f)",
pperc: "percentile(phenotype_value_f,5,25,50,75,95)",
pmin: "min(phenotype_value_f)",
pmax: "max(phenotype_value_f)",
denplot : {
type : range,
field : phenotype_value_f,
gap : ${PGAP:0.1},
start: ${PSTART:0},
end: ${PEND:1}
}
}'
I have translated this query to a search handler configuration in solrconfig.xml so a user only has to provide the PFIELD, PGAP, PSTART and PEND parameters. Here's how the configuration for the handler looks
<!--A request handler to serve data for violin plots (limited to IR assays)-->
<requestHandler name="/irViolin" class="solr.SearchHandler">
<!-- default values for query parameters can be specified, these
will be overridden by parameters in the request
-->
<lst name="defaults">
<str name="echoParams">explicit</str>
<int name="rows">0</int>
<str name="df">text</str>
<str name="wt">json</str>
<str name="json.nl">map</str>
<str name="json.facet">{
pmean: "avg(phenotype_value_f)",
pperc: "percentile(phenotype_value_f,5,25,50,75,95)",
pmin: "min(phenotype_value_f)",
pmax: "max(phenotype_value_f)",
denplot : {
type : range,
field : phenotype_value_f,
gap: ${PGAP:0.1},
start: ${PSTART:0},
end: ${PEND:1}
}
}
</str>
</lst>
<lst name="appends">
<str name="fq">bundle:pop_sample_phenotype</str>
<str name="fq">phenotype_type_s:"insecticide resistance"</str>
<str name="fq">has_geodata:true</str>
<str name="fq">phenotype_value_type_s:${PFIELD:"mortality rate"}</str>
</lst>
<lst name="invariants">
</lst>
</requestHandler>
Notice that I provided default values for all the parameters otherwise SOLR will fail to load the configuration. The problem is that using a query like this
curl http://localhost:7997/solr/vb_popbio/irViolin?q=*:*&
&PGAP=5&PSTART=0&PEND=101&PFIELD="mortality rate"
is not working. SOLR will read the request parameters fine (I can see them on the debug output) but will ignore them and use the default values in the configuration instead.
SOLR version is 5.2.1.
I tried moving the configuration parameters to either defaults, appends or invariants but nothing is working. After researching this for the past 2 days I'm almost ready to give up and just build the whole query on-the-fly instead.
Any help will be greatly appreciated.
Many thanks
I think (the post) is too old, but using a search engine I arrived at this page. A simple solution was to escape the dollar symbol. After that, you should achieve your desired result.
Example:
<str name="json.facet">{
pmean: "avg(phenotype_value_f)",
pperc: "percentile(phenotype_value_f,5,25,50,75,95)",
pmin: "min(phenotype_value_f)",
pmax: "max(phenotype_value_f)",
denplot : {
type : range,
field : phenotype_value_f,
gap: $${PGAP:0.1},
start: $${PSTART:0},
end: $${PEND:1}
}
}
</str>
I'm not sure when the Config API came to Solr but if query parameter substitution does work when added to configoverlay.json
{
"requestHandler": {
"/myHandler": {
"name": "/myHandler",
"class": "solr.SearchHandler",
"defaults": {
"fl": "id,name,color,size",
},
"invariants": {
"rows": 10,
},
"appends": {
"json": "{filter:[\"color:${color:red}\",\"size:${size:M}\"]}"
}
}
}
}
Now you can pass URL parameters &color=green&size=XXL to the /MyHandler query.
I am using solr 4.8.1.
When I execute any query for testing purpose from Dashboard I get response in JSON(BY DEFAULT)
Can I change it and make XML as default.
Plz refer below screen.
I am taking about dashboard only.
Thanks for looking here.... :)
The default values for your requestHandlers (which is what responds when a query is sent to /query or /select etc.), is set in solrconfig.xml. Here's the example from example/solr in the distribution:
<!-- A request handler that returns indented JSON by default -->
<requestHandler name="/query" class="solr.SearchHandler">
<lst name="defaults">
<str name="echoParams">explicit</str>
<str name="wt">json</str>
<str name="indent">true</str>
<str name="df">text</str>
</lst>
</requestHandler>
Changing wt to xml will give you a requestHandler that returns it response as XML by default, unless overridden at query time with the wt parameter. There might be parts of the web interface that assumes the response will be json, but I'm pretty sure those supply a value for wt anyway.
I dont know if there is administration for web UI defaults, but you can change html easily:
in
solr-4.8.1\example\solr-webapp\webapp\tpl\query.html
change order of options
<select name="wt" id="wt" title="The writer type (response format).">
<option>xml</option>
<option>json</option>
<option>python</option>
<option>ruby</option>
<option>php</option>
<option>csv</option>
</select>
Whatever option you put on first will be default, or set it selected:
<option selected="selected">
You may also change this html in war file in solr-4.8.1\example\webapps.
Note that path is relative to example from 4.8.1 release