2015-02-24 3 views
0

Я хочу сделать такой запрос: «банановая яблочная вишня» на поле «фрукты».Результаты с точным совпадением

Все фрукты в десертах должно быть в запросе, но не все фрукты в запросе должно быть в десертах ..

Вот пример ..

ИМЯ               ФРУКТЫ

Dessert1         банан яблоко                 OK (мы получили банан и яблоко в запросе)

Dessert2         вишня яблоко банан     OK (порядок не имеет значения)

Dessert3       вишня яблочная банановая дыня     НЕТ (в нашем случае отсутствует дыня)

public class ArrayStringFieldBridge implements TwoWayFieldBridge{ 


@Override 
public Object get(String name, Document document) { 
    IndexableField[] fields = document.getFields(name); 
    String[] values = new String[fields.length]; 
    for (int i=0; i<fields.length; i++) { 
     values[i] = fields[i].stringValue(); 
    } 
    return values; 
} 

@Override 
public String objectToString(Object value) { 
    return StringUtils.join((String[])value, " "); 
} 

@Override 
public void set(String name, Object value, Document document, LuceneOptions luceneOptions) { 
    String newString = StringUtils.join((String[])value, " "); 
    Field field = new Field(name, newString, luceneOptions.getStore(), luceneOptions.getIndex(), luceneOptions.getTermVector()); 
    field.setBoost(luceneOptions.getBoost()); 
    document.add(field); 
} 

}

@Indexed 
@AnalyzerDef(name = "customanalyzer", 
    tokenizer = @TokenizerDef(factory = StandardTokenizerFactory.class)) 
public class Dessert { 

    @Analyzer(definition="customanalyzer") 
    @Field(name = "equipment", index=Index.YES, analyze = Analyze.YES, store=Store.YES) 
    @FieldBridge(impl=ArrayStringFieldBridge.class) 
    public String[] fruits = new String[]{}; 
} 

Даже если вы не используете спящий режим-поиска, каждые предложения о теории для обработки, что было бы здорово ... Спасибо

ответ

1

Шаг 1: Огонь Lucene запрос «фрукты : банан или фрукты: яблоко или фрукты: вишня»

Шаг 2: Соберите все соответствующие документы десертных

Шаг 3: сообщение процесса совпадению десерт документ с запросом

  • новообращенный матч документа массива терминов matchDocArr: {банан, яблоко}
  • условия преобразования запроса в массив - queryArr: {банан, яблоко, вишня}
  • итерация над matchDocArr и убедитесь, что каждый член matchDocArr находится в queryArr массивом, если нет (использование дыни случай) нокаут этого согласованного документа

Ниже приведен пример функции, которая должна вызываться для каждого согласованного док

public static boolean isDocInterested(String query, String matchDoc) 
{ 
    List<String> matchDocArr = new ArrayList<String>(); 
    matchDocArr = Arrays.asList(matchDoc.split(" ")); 

    List<String> queryArr = new ArrayList<String>(); 
    queryArr = Arrays.asList(query.split(" ")); 

    int matchCounter = 0; 
    for(int i=0; i<matchDocArr.size(); i++) 
    { 
     if (queryArr.contains(matchDocArr.get(i))) 
      matchCounter++; 
    } 

    if (matchCounter == matchDocArr.size()) 
     return true; 

    return false; 
} 

Если функция возвращает TRUE, нас интересует документ/десерт, если он возвращает FALSE, игнорировать этот документ/десерт.

Конечно, эта функция может быть написана разными способами, но я думаю, что вы поняли суть.

Смежные вопросы