获得完全匹配的结果

Get results with exact match

我想做这样的查询:"banana apple cherry" 在 "fruit" 字段上。

查询中的所有水果都需要在甜点中,但查询中的水果不一定都在甜点中..

这是一个例子..

名称 水果

Dessert1 香蕉苹果 好的(查询中有香蕉和苹果)

甜点 2 樱桃苹果香蕉 OK(顺序无关紧要)

Dessert3 cherry apple banana melon NO(查询中缺少甜瓜)

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[]{};
}

即使您不使用 hibernate-search,每条关于处理该问题的理论的建议都会很棒...谢谢

第 1 步:Fire Lucene 查询 "fruit:banana OR fruit:apple OR fruit:cherry"

第 2 步:收集所有匹配的甜点文档

第 3 步:Post 使用查询处理您的匹配甜点文档

  • 将匹配文档转换为术语数组 matchDocArr : {banana, apple}
  • 将查询词转换为数组 - queryArr : {banana, apple, cherry}
  • 遍历 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;
}

if function returns TRUE 我们对 doc/dessert 感兴趣,如果 returns FALSE 忽略这个 doc/dessert.

当然这个函数可以用很多不同的方式编写,但我想你明白了。