You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@solr.apache.org by ep...@apache.org on 2022/11/11 18:03:51 UTC
[solr] branch branch_9x updated: SOLR-16409: Admin UI - Expose all highlighting parameters in the Query UI (#1067)
This is an automated email from the ASF dual-hosted git repository.
epugh pushed a commit to branch branch_9x
in repository https://gitbox.apache.org/repos/asf/solr.git
The following commit(s) were added to refs/heads/branch_9x by this push:
new 59e19dc8bdc SOLR-16409: Admin UI - Expose all highlighting parameters in the Query UI (#1067)
59e19dc8bdc is described below
commit 59e19dc8bdcf4f14f53b9f2667e90e76494d900e
Author: Jeanie Lam <wl...@bloomberg.net>
AuthorDate: Fri Nov 11 18:03:08 2022 +0000
SOLR-16409: Admin UI - Expose all highlighting parameters in the Query UI (#1067)
Nesting all the various options for highlighting by type of highlighter on the Admin page.
---
solr/CHANGES.txt | 2 +
solr/webapp/web/css/angular/query.css | 11 ++
solr/webapp/web/js/angular/controllers/query.js | 11 ++
solr/webapp/web/partials/query.html | 196 +++++++++++++++++++++++-
4 files changed, 216 insertions(+), 4 deletions(-)
diff --git a/solr/CHANGES.txt b/solr/CHANGES.txt
index 896879e4848..a3b221b72b6 100644
--- a/solr/CHANGES.txt
+++ b/solr/CHANGES.txt
@@ -14,6 +14,8 @@ New Features
* SOLR-16496: QueryElevationComponent now supports fq exclusions (Rudi Seitz via David Smiley)
+* SOLR-16409: Admin UI - Expose all highlighting parameters in the Query UI (Jeanie Lam via Eric Pugh)
+
Improvements
---------------------
diff --git a/solr/webapp/web/css/angular/query.css b/solr/webapp/web/css/angular/query.css
index 6f83e40aec1..d7696ba4d43 100644
--- a/solr/webapp/web/css/angular/query.css
+++ b/solr/webapp/web/css/angular/query.css
@@ -156,6 +156,17 @@ limitations under the License.
display: block;
}
+#content #query #add_advanced {
+ background-image: url( ../../img/ico/chevron-small-expand.png );
+ background-position: 100% 50%;
+ cursor: pointer;
+ padding-right: 21px;
+}
+
+#content #query #add_advanced.open {
+ background-image: url( ../../img/ico/chevron-small.png );
+}
+
#content #query #result
{
float: right;
diff --git a/solr/webapp/web/js/angular/controllers/query.js b/solr/webapp/web/js/angular/controllers/query.js
index 14678d26572..9ddda0511b4 100644
--- a/solr/webapp/web/js/angular/controllers/query.js
+++ b/solr/webapp/web/js/angular/controllers/query.js
@@ -165,10 +165,21 @@ solrAdminApp.controller('QueryController',
return param.indexOf(argParam) === 0;
});
}
+
+ var getHighlighterFieldsToPurge = function(hlMethod){
+ // first, select the fieldsets which ng-show includes val['hl.method'] but not val['hl.method']==${hlMethod}
+ // then, select their descendants that have ng-model
+ const selector = `div.fieldset[ng-show*="val['hl.method']"]:not([ng-show*="val['hl.method']=='${hlMethod}'"])
+ [ng-model]`;
+ // return the field names
+ return Array.from(document.querySelectorAll(selector), x => x.name);
+ }
+
copy(params, $scope.val);
purgeParams(params, ["q.alt", "qf", "mm", "pf", "ps", "qs", "tie", "bq", "bf"], $scope.val.defType !== "dismax" && $scope.val.defType !== "edismax");
purgeParams(params, ["uf", "pf2", "pf3", "ps2", "ps3", "boost", "stopwords", "lowercaseOperators"], $scope.val.defType !== "edismax");
purgeParams(params, getDependentFields("hl"), $scope.val.hl !== true);
+ purgeParams(params, getHighlighterFieldsToPurge($scope.val["hl.method"]), true);
purgeParams(params, getDependentFields("facet"), $scope.val.facet !== true);
purgeParams(params, ["spatial", "pt", "sfield", "d"], $scope.val.spatial !== true);
purgeParams(params, getDependentFields("spellcheck"), $scope.val.spellcheck !== true);
diff --git a/solr/webapp/web/partials/query.html b/solr/webapp/web/partials/query.html
index 051d3c4d2a9..48e618643a7 100644
--- a/solr/webapp/web/partials/query.html
+++ b/solr/webapp/web/partials/query.html
@@ -208,11 +208,21 @@ limitations under the License.
<label for="hl_fl" title="Fields to highlight on.">hl.fl</label>
<input type="text" ng-model="val['hl.fl']" name="hl.fl" id="hl_fl" value="" title="Fields to highlight on.">
- <label for="hl_simple_pre">hl.simple.pre</label>
- <input type="text" ng-model="val['hl.simple.pre']" name="hl.simple.pre" id="hl_simple_pre" value="<em>">
+ <div class="fieldset" ng-show="val['hl.method']=='original'">
+ <label for="hl_simple_pre">hl.simple.pre</label>
+ <input type="text" ng-model="val['hl.simple.pre']" name="hl.simple.pre" id="hl_simple_pre" value="<em>">
- <label for="hl_simple_post">hl.simple.post</label>
- <input type="text" ng-model="val['hl.simple.post']" name="hl.simple.post" id="hl_simple_post" value="</em>">
+ <label for="hl_simple_post">hl.simple.post</label>
+ <input type="text" ng-model="val['hl.simple.post']" name="hl.simple.post" id="hl_simple_post" value="</em>">
+ </div>
+
+ <div class="fieldset" ng-show="val['hl.method']=='unified' || val['hl.method']=='fastVector'">
+ <label for="hl_tag_pre">hl.tag.pre</label>
+ <input type="text" ng-model="val['hl.tag.pre']" name="hl.tag.pre" id="hl_tag_pre" value="<em>">
+
+ <label for="hl_tag_post">hl.tag.post</label>
+ <input type="text" ng-model="val['hl.tag.post']" name="hl.tag.post" id="hl_tag_post" value="</em>">
+ </div>
<label for="hl_requireFieldMatch" class="checkbox">
<input type="checkbox" ng-model="val['hl.requireFieldMatch']" name="hl.requireFieldMatch" id="hl_requireFieldMatch" value="true">
@@ -229,6 +239,184 @@ limitations under the License.
hl.highlightMultiTerm
</label>
+ <label for="hl_q">hl.q</label>
+ <input type="text" ng-model="val['hl.q']" name="hl.q" id="hl_q" value="">
+
+ <label for="hl_qparser">hl.qparser</label>
+ <input type="text" ng-model="val['hl.qparser']" name="hl.qparser" id="hl_qparser" value="">
+
+ <label for="hl_snippets">hl.snippets</label>
+ <input type="text" ng-model="val['hl.snippets']" name="hl.snippets" id="hl_snippets" value="">
+
+ <label for="hl_fragsize">hl.fragsize</label>
+ <input type="text" ng-model="val['hl.fragsize']" name="hl.fragsize" id="hl_fragsize" value="">
+
+ <label for="hl_encoder">hl.encoder</label>
+ <input type="text" ng-model="val['hl.encoder']" name="hl.encoder" id="hl_encoder" value="">
+
+ <label for="hl_maxAnalyzedChars">hl.maxAnalyzedChars</label>
+ <input type="text" ng-model="val['hl.maxAnalyzedChars']" name="hl.maxAnalyzedChars" id="hl_maxAnalyzedChars" value="">
+
+ <label for="hl_method" title="Choose hl.method">
+ hl.method
+ <select ng-model="val['hl.method']" name="hl_method" id="hl_method">
+ <option ng-selected="selected" value=''>------</option>
+ <option value="unified">unified</option>
+ <option value="original">original</option>
+ <option value="fastVector">fastVector</option>
+ </select>
+ </label>
+
+ <p class="clearfix"><a ng-show="val['hl']" ng-click="showAdvanced=!showAdvanced">
+ <span id="add_advanced" ng-class="{open: showAdvanced}">Show advanced</span></a></p>
+ <div ng-show="showAdvanced">
+ <div class="fieldset" ng-show="val['hl.method']=='unified'">
+ <label for="hl_offsetSource" title="Choose hl.offsetSource">
+ hl.offsetSource
+ <select ng-model="val['hl.offsetSource']" name="hl.offsetSource" id="hl_offsetSource">
+ <option ng-selected="selected" value=''>------</option>
+ <option value="ANALYSIS">ANALYSIS</option>
+ <option value="POSTINGS">POSTINGS</option>
+ <option value="POSTINGS_WITH_TERM_VECTORS">POSTINGS_WITH_TERM_VECTORS</option>
+ <option value="TERM_VECTORS">TERM_VECTORS</option>
+ </select>
+ </label>
+
+ <label for="hl_fragAlignRatio">hl.fragAlignRatio</label>
+ <input type="text" ng-model="val['hl.fragAlignRatio']" name="hl.fragAlignRatio" id="hl_fragAlignRatio">
+
+ <label for="hl_fragsizeIsMinimum" class="checkbox">
+ <input type="checkbox" ng-model="val['hl.fragsizeIsMinimum']" name="hl.fragsizeIsMinimum" id="hl_fragsizeIsMinimum" value="true">
+ hl.fragsizeIsMinimum
+ </label>
+
+ <label for="hl_tag_ellipsis">hl.tag.ellipsis</label>
+ <input type="text" ng-model="val['hl.tag.ellipsis']" name="hl.tag.ellipsis" id="hl_tag_ellipsis">
+
+ <label for="hl_defaultSummary" class="checkbox">
+ <input type="checkbox" ng-model="val['hl.defaultSummary']" name="hl.defaultSummary" id="hl_defaultSummary">
+ hl.defaultSummary
+ </label>
+
+ <label for="hl_score_k1">hl.score.k1</label>
+ <input type="text" ng-model="val['hl.score.k1']" name="hl.score.k1" id="hl_score_k1">
+
+ <label for="hl_score_b">hl.score.b</label>
+ <input type="text" ng-model="val['hl.score.b']" name="hl.score.b" id="hl_score_b">
+
+ <label for="hl_score_pivot">hl.score.pivot</label>
+ <input type="text" ng-model="val['hl.score.pivot']" name="hl.score.pivot" id="hl_score_pivot">
+
+ <label for="hl_bs_language">hl.bs.language</label>
+ <input type="text" ng-model="val['hl.bs.language']" name="hl.bs.language" id="hl_bs_language">
+
+ <label for="hl_bs_country">hl.bs.country</label>
+ <input type="text" ng-model="val['hl.bs.country']" name="hl.bs.country" id="hl_bs_country">
+
+ <label for="hl_bs_variant">hl.bs.variant</label>
+ <input type="text" ng-model="val['hl.bs.variant']" name="hl.bs.variant" id="hl_bs_variant">
+
+ <label for="hl_bs_type">
+ hl.bs.type
+ <select ng-model="val['hl.bs.type']" name="hl.bs.type" id="hl_bs_type">
+ <option ng-selected="selected" value=''>------</option>
+ <option value="SENTENCE">SENTENCE</option>
+ <option value="SEPARATOR">SEPARATOR</option>
+ <option value="WORD">WORD</option>
+ <option value="CHARACTER">CHARACTER</option>
+ <option value="LINE">LINE</option>
+ <option value="WHOLE">WHOLE</option>
+ </select>
+ </label>
+
+ <label for="hl_bs_separator">hl.bs.separator</label>
+ <input type="text" ng-model="val['hl.bs.separator']" name="hl.bs.separator" id="hl_bs_separator">
+
+ <label for="hl_weightMatches" class="checkbox">
+ <input type="checkbox" ng-model="val['hl.weightMatches']" name="hl.weightMatches" id="hl_weightMatches" value=true>
+ hl.weightMatches
+ </label>
+ </div>
+
+ <div class="fieldset" ng-show="val['hl.method']=='original'">
+ <label for="hl_mergeContiguous" class="checkbox">
+ <input type="checkbox" ng-model="val['hl.mergeContiguous']" name="hl.mergeContiguous" id="hl_mergeContiguous">
+ hl.mergeContiguous
+ </label>
+
+ <label for="hl_maxMultiValuedToExamine">hl.maxMultiValuedToExamine</label>
+ <input type="text" ng-model="val['hl.maxMultiValuedToExamine']" name="hl.maxMultiValuedToExamine" id="hl_maxMultiValuedToExamine">
+
+ <label for="hl_maxMultiValuedToMatch">hl.maxMultiValuedToMatch</label>
+ <input type="text" ng-model="val['hl.maxMultiValuedToMatch']" name="hl.maxMultiValuedToMatch" id="hl_maxMultiValuedToMatch">
+
+ <label for="hl_formatter">
+ hl.formatter
+ <select ng-model="val['hl.formatter']" name="hl.formatter" id="hl_formatter">
+ <option ng-selected="selected" value="">------</option>
+ <option value="simple">simple</option>
+ </select>
+ </label>
+
+ <label for="hl_fragmenter">
+ hl.fragmenter
+ <select ng-model="val['hl.fragmenter']" name="hl.fragmenter" id="hl_fragmenter">
+ <option ng-selected="selected" value="">------</option>
+ <option value="gap">gap</option>
+ <option value="regex">regex</option>
+ </select>
+ </label>
+
+ <label for="hl_regex_slop">hl.regex.slop</label>
+ <input type="text" ng-model="val['hl.regex.slop']" name="hl.regex.slop" id="hl_regex_slop">
+
+ <label for="hl_regex_pattern">hl.regex.pattern</label>
+ <input type="text" ng-model="val['hl.regex.pattern']" name="hl.regex.pattern" id="hl_regex_pattern">
+
+ <label for="hl_regex_maxAnalyzedChars">hl.regex.maxAnalyzedChars</label>
+ <input type="text" ng-model="val['hl.regex.maxAnalyzedChars']" name="hl.regex.maxAnalyzedChars" id="hl_regex_maxAnalyzedChars">
+
+ <label for="hl_preserveMulti" class="checkbox">
+ <input type="checkbox" ng-model="val['hl.preserveMulti']" name="hl.preserveMulti" id="hl_preserveMulti">
+ hl.preserveMulti
+ </label>
+
+ <label for="hl_payloads" class="checkbox">
+ <input type="checkbox" ng-model="val['hl.payloads']" name="hl.payloads" id="hl_payloads" value=true>
+ hl.payloads
+ </label>
+ </div>
+
+ <div class="fieldset" ng-show="val['hl.method']=='original' || val['hl.method']=='fastVector'">
+ <label for="hl_alternateField">hl.alternateField</label>
+ <input type="text" ng-model="val['hl.alternateField']" name="hl.alternateField" id="hl_alternateField">
+
+ <label for="hl_maxAlternateFieldLength">hl.maxAlternateFieldLength</label>
+ <input type="text" ng-model="val['hl.maxAlternateFieldLength']" name="hl.maxAlternateFieldLength" id="hl_maxAlternateFieldLength">
+
+ <label for="hl_highlightAlternate" class="checkbox">
+ <input type="checkbox" ng-model="val['hl.highlightAlternate']" name="hl.highlightAlternate" id="hl_highlightAlternate" value=true>
+ hl.highlightAlternate
+ </label>
+ </div>
+
+ <div class="fieldset" ng-show="val['hl.method']=='fastVector'">
+ <label for="hl_fragListBuilder">hl.fragListBuilder</label>
+ <input type="text" ng-model="val['hl.fragListBuilder']" name="hl.fragListBuilder" id="hl_fragListBuilder">
+
+ <label for="hl_fragmentsBuilder">hl.fragmentsBuilder</label>
+ <input type="text" ng-model="val['hl.fragmentsBuilder']" name="hl.fragmentsBuilder" id="hl_fragmentsBuilder">
+
+ <label for="hl_boundaryScanner">hl.boundaryScanner</label>
+ <input type="text" ng-model="val['hl.boundaryScanner']" name="hl.boundaryScanner" id="hl_boundaryScanner">
+
+ <label for="hl_phraseLimit">hl.phraseLimit</label>
+ <input type="text" ng-model="val['hl.phraseLimit']" name="hl.phraseLimit" id="hl_phraseLimit">
+
+ <label for="hl_multiValuedSeparatorChar">hl.multiValuedSeparatorChar</label>
+ <input type="text" ng-model="val['hl.multiValuedSeparatorChar']" name="hl.multiValuedSeparatorChar" id="hl_multiValuedSeparatorChar">
+ </div>
+ </div>
</div>
</fieldset>