Reputation: 3
I have fields for name and dimensions. The fields are: Name
, dimensionLength
, dimensionWidth
and dimensionHeight
.
I want query productX 10x20
only to return matches containing both dimensions. So query above can return productX 10x20x30
and productX 10x30x20
, but shouldn't return productX 10x30x40
.
The first results are fine, but i get many other irrelevant matches. Any Ideas how to avoid these irrelevant results?
To clarify, fields are:
<field indexed="true" multiValued="true" name="Height_mm_Copy" stored="false" type="dimension"/>
<field indexed="true" multiValued="true" name="Outside_diameter_mm_Copy" stored="false" type="dimension"/>
<field indexed="true" multiValued="true" name="Inside_diameter_mm_Copy" stored="false" type="dimension"/>
<field indexed="true" name="name" stored="true" type="title"/>
Fieldtype for dimensions:
<fieldType class="solr.TextField" name="dimension" omitNorms="true" positionIncrementGap="100">
<analyzer type="index">
<tokenizer class="solr.WhitespaceTokenizerFactory"/>
<filter class="solr.PatternReplaceFilterFactory" pattern="(\d+)+([.][0])" replacement="$1"/>
<filter class="solr.TrimFilterFactory"/>
<filter class="solr.RemoveDuplicatesTokenFilterFactory"/>
</analyzer>
<analyzer type="query">
<tokenizer class="solr.WhitespaceTokenizerFactory"/>
<filter class="solr.PatternReplaceFilterFactory" pattern="," replace="all" replacement="."/>
<filter class="solr.TrimFilterFactory"/>
<filter class="solr.PatternReplaceFilterFactory" pattern="(\d+)+([.][0])" replacement="$1"/>
<filter catenateAll="0" catenateNumbers="0" catenateWords="0" class="solr.WordDelimiterFilterFactory" generateNumberParts="1" generateWordParts="0" preserveOriginal="1" splitOnCaseChange="0" splitOnNumerics="1" types="wdfftypes.txt"/>
<filter class="solr.ASCIIFoldingFilterFactory"/>
<filter class="solr.RemoveDuplicatesTokenFilterFactory"/>
</analyzer>
requestHandler:
<requestHandler name="dismax" class="solr.SearchHandler" >
<lst name="defaults">
<str name="defType">dismax</str>
<str name="echoParams">explicit</str>
<float name="tie">0.3</float>
<str name="qf">
supplierArticleId_Prefix
</str>
<str name="fl">
UUID,score
</str>
<str name="mm">
3<-1 5<-2 6<90%
</str>
<int name="ps">100</int>
<str name="q.alt">*:*</str>
</lst>
<arr name="last-components">
<str>spellcheck</str>
</arr>
</requestHandler>
Upvotes: 0
Views: 191
Reputation: 3
Solved it by making a copy field of "name". By using
<filter class="solr.PatternCaptureGroupFilterFactory" pattern="(\d+/*[xX]\d+)" preserve_original="false"/>
in the fieldType for this field. So from string "product 10x20x30" only "10x20" remains indexed in this field.
Upvotes: 0