我无法弄清楚我的RavenDB查询是否按预期工作。
我正在尝试根据用户搜索查询进行完全匹配,以匹配字符串中的所有单词。
因此,当我输入“大众汽车”时,我希望获得所有类型的“大众”汽车。 如果我输入“大众高尔夫”,我想只获得“大众高尔夫”,等等......
到目前为止我有什么
public IEnumerable<Cars> GetSearch(string query)
{
return _documentSession.Query<Car>("CarIndex").Search(x => x.SearchQuery, query);
}
//Also tried with this one
public IEnumerable<Cars> GetSearch(string query)
{
return _documentSession.Query<Car>("CarIndex")
.Search(x => x.Make, query)
.Search(x => x.Model, query);
}
public class CarIndex : AbstractIndexCreationTask<Car>
{
public CarIndex()
{
Map = cars => from car in cars select
new
{
car.SearchQuery,
car.Make,
car.Model,
car.Year
};
Index(x => x.Id, FieldIndexing.No);
Index(x => x.SearchQuery, FieldIndexing.Analyzed);
Index(x => x.Make, FieldIndexing.NotAnalyzed);
Index(x => x.Model, FieldIndexing.NotAnalyzed);
Index(x => x.Year, FieldIndexing.NotAnalyzed);
}
}
private void AddDummyData()
{
var cars = new List<Car>
{
new Car {Id = 1, Make = "Volkswagen", Model = "Touran", Year = 1998 },
new Car {Id = 2, Make = "Volkswagen", Model = "Polo", Year = 2000 },
new Car {Id = 3, Make = "Nissan", Model = "Micra", Year = 2005 },
new Car {Id = 4, Make = "Bugatti", Model = "Veyron", Year = 2010 },
new Car {Id = 5, Make = "Ferrari", Model = "Spider 458", Year = 2011 },
new Car {Id = 6, Make = "Aston Martin", Model = "Vanquish", Year = 2010 },
new Car {Id = 7, Make = "Ford", Model = "Focus", Year = 2001 },
new Car {Id = 8, Make = "Fiat", Model = "Punto", Year = 2013 },
new Car {Id = 9, Make = "Peugeot", Model = "206", Year = 2006 },
new Car {Id = 10, Make = "Opel", Model = "Ascona", Year = 2002 },
new Car {Id = 11, Make = "Volkswagen", Model = "Golf", Year = 1997 }
};
foreach (var car in cars)
{
car.SearchQuery = car.Make + " " + car.Model;
_documentSession.Store(car);
}
_documentSession.SaveChanges();
}
问题是当make包含两个词:“阿斯顿马丁”等。 有人能填补我所缺少的东西吗?
答案 0 :(得分:1)
我相信这是因为你的Lucene。仅使用FieldIndexing.Analyzed它假定您要使用StandardAnalyzer进行标记化。因此,当您传入多个单词时,它会找到与这些单词相匹配的任何内容。
由于您希望所有单词都匹配,您可以执行类似
的操作var search = string.Join(" ", query
.Split(new[] { " " }, StringSplitOptions.RemoveEmptyEntries)
.Select(x => string.Format("{0}* ", x)));
query =
_documentSession.Query<Car>("CarIndex")
.Statistics(out stats)
.Search(x => x.SearchQuery, search, 10, SearchOptions.And, EscapeQueryOptions.AllowPostfixWildcard)
或者您可以更改分析器
http://ravendb.net/docs/client-api/querying/static-indexes/configuring-index-options