2016-05-10 28 views
0

Wir haben die folgende Konfiguration in unserem schema.xml:Solr Boost-Abfrage durch Feldwert und innerhalb neuestes Datum

<field name="last_modified" type="date" indexed="true" stored="true" multiValued="false" omitTermFreqAndPositions="true"/> 
... 

<field name="prefix" type="string" indexed="true" stored="true" omitTermFreqAndPositions="true"/> 

Unser Ziel ist die Dokumentation von

  1. prefix = 9999 mit neuestem zu sortieren docs (zuletzt) ​​erste
  2. prefix = 1004 oder 1005 mit prefix = neuesten docs (zuletzt) ​​ersten

unserer Code:

{!boost b=recip(ms(NOW,last_modified),3.16e11,1,1)}prefix:9999^1000000 OR {!boost b=recip(ms(NOW,last_modified),3.16e-11,1,1)}prefix:1004^600000 OR {!boost b=recip(ms(NOW,last_modified),3.16e-11,1,1)}prefix:1005^600000 

Ergebnis: Die obige Abfrage funktioniert nicht wie erwartet!

Wir dachten, dass omitTermFreqAndPositions = true erzwingt ITF zu verhindern und das Scoring sollte funktionieren. Aber es scheint nicht so! Bitte helfen Sie uns dabei :-)

Antwort

1

So haben wir eine Lösung gefunden!

  1. Erstellen Sie Ihre eigene Ähnlichkeit (eine einfache Java-Klasse) für eine bessere und einfachere Beschreibungen wie, bitte How to compile a custom similarity class for SOLR/Lucene using Eclipse

Die Klasse lesen wir

verwenden
package com.luxactive; 
import org.apache.lucene.index.FieldInvertState; 
import org.apache.lucene.search.similarities.DefaultSimilarity; 

public class MyNewSimilarityClass extends DefaultSimilarity { 

@Override 
public float coord(int overlap, int maxOverlap) { 
    return 1.0f; 
} 

@Override 
public float idf(long docFreq, long numDocs) { 
    return 1.0f; 
} 

@Override 
public float lengthNorm(FieldInvertState arg0) { 
    return 1.0f; 
} 

@Override 
public float tf(float freq) { 
    return 1.0f; 
} 

} 
  1. Erstellen Sie ein einfaches Glas mit Ihrer Ähnlichkeit
  2. Kopieren Sie das Glas in einen beliebigen Ordner in Ihrem Solr-Server, verwendeten wir: SOLRFOLDER/solr-4.8.0/example/solr/dih

Die nächsten Schritte müssen jede Kollektion Sie haben zu tun!

  1. Bearbeiten Sie die solrconfig.xml an: SOLRFOLDER/solr-4.8.0/example/solr/collection/conf/solrconfig.xml
    <lib dir="../dih" regex=".*\.jar" /> Fügen Sie das benutzerdefinierte jar
  2. bearbeiten die schema.xml im selben Ordner

speichern zu importieren folgende

<!-- DEFAULT Factory for custom com.luxactive.MyNewSimilarityClass --> 
<similarity class="solr.SchemaSimilarityFactory"/> 

<!-- TYPE String --> 
<fieldType name="no_term_frequency_string" class="solr.StrField" sortMissingLast="true" > 
    <similarity class="com.luxactive.MyNewSimilarityClass"/> 
</fieldType> 

<!-- TYPE Date --> 
<fieldType name="no_term_frequency_date" class="solr.TrieDateField" sortMissingLast="true" > 
    <similarity class="com.luxactive.MyNewSimilarityClass"/> 
</fieldType> 

<!-- TYPE Int--> 
<fieldType name="no_term_frequency_int" class="solr.TrieIntField" sortMissingLast="true" > 
    <similarity class="com.luxactive.MyNewSimilarityClass"/> 
</fieldType> 

Hier definieren Sie Ihre eigenen Feldtypen (int, string und Datum), die die neue Ähnlichkeitsklasse verwenden, die einen Anhebungswert lik zurück In der MyNewSimilarityClass definiert.

  1. Bearbeiten Sie nun die Felder, die Sie für Ihre benutzerdefinierte Ähnlichkeit verwenden möchten, indem Sie ihren Typ auf einen von Ihnen erstellten festlegen.
    Von: <field name="last_modified" type="date" indexed="true" stored="true" multiValued="false" />
    An: <field name="last_modified" type="no_term_frequency_date" indexed="true" stored="true" multiValued="false" />
  2. Starten Sie den solr Server und genießen Sie Ihre Steigerung :)