W moim kodu 3,6 byłem dodając pole numeryczne do mojego indeksu w następujący sposób:jak ty indeksu i searchnumbers w Lucene 4.1
public void addNumericField(IndexField field, Integer value) {
addField(field, NumericUtils.intToPrefixCoded(value));
}
jednak teraz trzeba przekazać go argument BytesRef, a jej całkowicie jasne, co Państwo mają do czynienia z wartością obok więc zamiast zmieniłem go (praca w toku)
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));
}
która wydawała neater
w 3.6 Dodam przesłonić queryparser aby pracować dla numerycznych wyszukiwań zasięgu,
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;
}
}
Więc wziąłem to wszystko na zastanawianie nie zrobił tego potrzebują więcej, ale niestety nie ma pytania dotyczące tego IntField obecnie pracuje.
Dalsze czytanie wygląda na to, że Intfieldy są używane tylko dla zapytań o zakres, więc nie wiem, w jaki sposób należy po prostu dopasowywać zapytania i czy NumericRangeQuery jest kompatybilny z klasycznym analizatorem zapytań, którego używam.
Więc potem wrócił do próbując dodać moje wartości numeryczne jako zakodowany ciąg
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));
}
Ale w czasie wykonywania Jestem teraz coraz błąd!
java.lang.IllegalArgumentException: Fields with BytesRef values cannot be indexed
Ale muszę pola indeksu, więc jak mogę indeks pola numeryczne jak ja w 3.6 więc można je wyszukiwać.
Ale jeśli korzystasz z IntField, w jaki sposób mogę rozszerzyć QueryParser o przeszukiwanie takich pól? –
Powoduje zwrócenie odpowiedniego parametru NumericRangeQuery z analizowanych wartości do liczby całkowitej. Tak więc, zamiast zwracania TermQuery, zwróć numericRangeQuery w metodzie newTermQuery, jeśli to konieczne. – RobAu