Wie wollen Sie index und searchnumbers in Lucene 4.1

In meinem 3.6 code ich das hinzufügen numerisches Feld, um meinen index wie folgt:

public void addNumericField(IndexField field, Integer value) {
        addField(field, NumericUtils.intToPrefixCoded(value));
    }

aber jetzt müssen Sie es übergeben BytesRef argument, und seine völlig unklar, was Sie gemeint sind zu tun mit dem Wert weiter, so dass statt ich habe es geändert (work in progress)

public void addNumericField(IndexField field, Integer value) {
        FieldType ft = new FieldType();
        ft.setStored(true);
        ft.setIndexed(true);
        ft.setNumericType(FieldType.NumericType.INT);
        doc.add(new IntField(field.getName(), value, ft));
    }

schien ordentlicher

In 3.6 ich auch hinzufügen, überschreiben queryparser zu machen, arbeiten für den numerischen Bereich sucht,

package org.musicbrainz.search.servlet;

import org.apache.lucene.index.Term;
import org.apache.lucene.queryparser.classic.MultiFieldQueryParser;
import org.apache.lucene.search.Query;
import org.apache.lucene.search.TermQuery;
import org.apache.lucene.search.TermRangeQuery;
import org.apache.lucene.util.NumericUtils;
import org.musicbrainz.search.LuceneVersion;
import org.musicbrainz.search.index.LabelIndexField;
import org.musicbrainz.search.servlet.mmd1.LabelType;

public class LabelQueryParser extends MultiFieldQueryParser {

    public LabelQueryParser(java.lang.String[] strings, org.apache.lucene.analysis.Analyzer analyzer)
    {
        super(LuceneVersion.LUCENE_VERSION, strings, analyzer);
    }

     protected Query newTermQuery(Term term) {

        if(
                (term.field() == LabelIndexField.CODE.getName())
                ){
            try {
                int number = Integer.parseInt(term.text());
                TermQuery tq = new TermQuery(new Term(term.field(), NumericUtils.intToPrefixCoded(number)));
                return tq;
            }
            catch (NumberFormatException nfe) {
                //If not provided numeric argument just leave as is, 
                //won't give matches
                return super.newTermQuery(term);
            }
        } else {
            return super.newTermQuery(term);

        }
    }

    /**
     *
     * Convert Numeric Fields
     *
     * @param field
     * @param part1
     * @param part2
     * @param inclusive
     * @return
     */
    @Override
    public Query newRangeQuery(String field,
                               String part1,
                               String part2,
                               boolean inclusive) {

        if (
                (field.equals(LabelIndexField.CODE.getName()))
            )
        {
            part1 = NumericUtils.intToPrefixCoded(Integer.parseInt(part1));
            part2 = NumericUtils.intToPrefixCoded(Integer.parseInt(part2));
        }
        TermRangeQuery query = (TermRangeQuery)
                super.newRangeQuery(field, part1, part2,inclusive);
        return query;
    }

}

Also nahm ich alle dies herauszufinden habe ich nicht mehr brauchen, aber leider keine Anfragen auf dieser IntField jetzt arbeiten.

Lesen weiter es scheint Intfields sind nur für range-Abfragen, so dass ich nicht weiß, wie Sie gemeint sind, nur das zu tun, Abgleich von Abfragen, und ob die NumericRangeQuery ist comptable mit der klassischen Abfrage-Parser, die ich verwende.

So, dann ging ich zurück zu versuchen, um meine numerischen Werte als codierte Zeichenfolge

public void addNumericField(IndexField field, Integer value) {

    FieldType fieldType = new FieldType();
    fieldType.setStored(true);
    fieldType.setIndexed(true);
    BytesRef bytes = new BytesRef(NumericUtils.BUF_SIZE_INT);
    NumericUtils.intToPrefixCoded(value, 0, bytes);
    doc.add(new Field(field.getName(),bytes, fieldType));
}

Aber bei der Laufzeit bin ich jetzt immer Fehler !

java.lang.IllegalArgumentException: Fields with BytesRef values cannot be indexed

Aber ich muss Indexfeld, also bitte, wie kann ich index numerische Felder wie ich in 3.6, so kann ich Ihnen suchen.

InformationsquelleAutor Paul Taylor | 2013-02-25
Schreibe einen Kommentar