获得完全匹配的结果
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.
当然这个函数可以用很多不同的方式编写,但我想你明白了。
我想做这样的查询:"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.
当然这个函数可以用很多不同的方式编写,但我想你明白了。