干草堆多场搜索(haystack multiple field search)
嗨我使用干草堆与woosh作为搜索引擎:
我的模型如下所示
class Person(models.Model): personid = models.IntegerField(primary_key = True, db_column = 'PID') firstname = models.CharField(max_length = 50, db_column = 'FIRSTNAME') lastname = models.CharField(max_length = 50, db_column = 'LASTNAME') class Meta: db_table = '"TEST"."PERSON"' managed = False class TDoc(models.Model): tdocid = models.IntegerField(primary_key = True, db_column = 'TDOCID') person = models.ForeignKey(Person, db_column = 'PID') content = models.TextField(db_column = 'CONTENT', blank = True) filepath = models.TextField(db_column = 'FILEPATH', blank = True) class Meta: db_table = '"TEST"."TDOC"' managed = False
search_index.py如下:
class TDocIndex(SearchIndex): content = CharField(model_attr = 'content', document = True) filepaht = CharField(model_attr = 'filepath') person = CharField(model_attr = 'person') def get_queryset(self): return TDoc.objects.all() def prepare_person(self, obj): # Store a list of id's for filtering return obj.person.lastname site.register(TDoc, TDocIndex)
我的问题是我想做多个字段搜索
内容:xxx和人:SMITH
在干草堆上,它立即搜索所有这些我无法进行特定的野外搜索。 我怀疑我的索引已损坏但是:
ix = open_dir("/testindex") searcher = ix.searcher() mparser = MultifieldParser(["content", "filepath", "person"], schema = ix.schema) myquery = mparser.parse(content:xxx AND person:SMITH') results = searcher.search(myquery) for result in results: print result
但它的工作原理和返回的正确值。 我在教程中使用标准的haystack SearchView,search.html
(r'^search/', include('haystack.urls')),
Hi i m using haystack with a woosh as search engine:
my model looks as follows
class Person(models.Model): personid = models.IntegerField(primary_key = True, db_column = 'PID') firstname = models.CharField(max_length = 50, db_column = 'FIRSTNAME') lastname = models.CharField(max_length = 50, db_column = 'LASTNAME') class Meta: db_table = '"TEST"."PERSON"' managed = False class TDoc(models.Model): tdocid = models.IntegerField(primary_key = True, db_column = 'TDOCID') person = models.ForeignKey(Person, db_column = 'PID') content = models.TextField(db_column = 'CONTENT', blank = True) filepath = models.TextField(db_column = 'FILEPATH', blank = True) class Meta: db_table = '"TEST"."TDOC"' managed = False
The search_index.py is as follows:
class TDocIndex(SearchIndex): content = CharField(model_attr = 'content', document = True) filepaht = CharField(model_attr = 'filepath') person = CharField(model_attr = 'person') def get_queryset(self): return TDoc.objects.all() def prepare_person(self, obj): # Store a list of id's for filtering return obj.person.lastname site.register(TDoc, TDocIndex)
My problem is i would like to do multiple filed searches like
content:xxx AND person:SMITH
On haystack it search all of them at once i can't do specific field search. I suspected that my index is corrupt but:
ix = open_dir("/testindex") searcher = ix.searcher() mparser = MultifieldParser(["content", "filepath", "person"], schema = ix.schema) myquery = mparser.parse(content:xxx AND person:SMITH') results = searcher.search(myquery) for result in results: print result
but it works and return's the correct value. I m using the standard haystack SearchView,search.html from the tutorial
(r'^search/', include('haystack.urls')),
原文:https://stackoverflow.com/questions/3469952
最满意答案
您有多种方式,例如:
使用
SqlDataAdapter
填充DataTable
:DataTable table = new DataTable(); using (var con = new SqlConnection("connection string")) using (var da = new SqlDataAdapter("Sql-Query", con)) da.Fill(table); object secondRowSecondColumnValue = table.Rows[1][1];
如果你知道它是一个
int
:int value = table.Rows[1].Field<int>(1);
使用
SqlDataReader
不太简洁:int? value = null; using (var con = new SqlConnection("connection string")) using(var cmd = new SqlCommand("Sql-Query", con)) { con.Open(); int row = 0; using (var rd = cmd.ExecuteReader()) { while (rd.Read()) { row++; if (row == 2) { value = rd.GetInt32(1); break; } } } }
如果您只想要该值,则最佳选择是首先仅选择此值。
You have multiple ways, for example:
Using a
SqlDataAdapter
to fill aDataTable
:DataTable table = new DataTable(); using (var con = new SqlConnection("connection string")) using (var da = new SqlDataAdapter("Sql-Query", con)) da.Fill(table); object secondRowSecondColumnValue = table.Rows[1][1];
If you know that it's an
int
:int value = table.Rows[1].Field<int>(1);
Using a
SqlDataReader
is less concise:int? value = null; using (var con = new SqlConnection("connection string")) using(var cmd = new SqlCommand("Sql-Query", con)) { con.Open(); int row = 0; using (var rd = cmd.ExecuteReader()) { while (rd.Read()) { row++; if (row == 2) { value = rd.GetInt32(1); break; } } } }
If you only want that value the best option is to select only this value in the first place.
相关问答
更多-
Dapper如何在ADO.Net中创建正确命令类的实例?(How does Dapper create an instance of the correct command class in ADO.Net?)[2021-12-09]
每个特定的DBConnection实现一个IDBConnection接口,该接口具有CreateCommand方法。 Dapper只是打电话给那个。 Each specific DBConnection implements an IDBConnection interface, which has a CreateCommand method. Dapper just calls that. -
private bool SpalteExistiert(FbDataReader Reader, string MyColumnName) { return Reader.GetSchemaTable() .Rows .OfType
() .Any(row => string.Equals(row.Field ("ColumnName"), MyColumnName, StringComparison.InvariantCu ... -
什么是ADO.NET?(What is ADO.NET? [closed])[2022-02-08]
ADO.NET是一种.NET技术,旨在使编写代码更容易。 它不是数据库(SQL Server是数据库服务器),它是用于访问数据库的工具。 ADO.NET最后一个版本附带“实体框架”,一个对象关系映射器(另一个旨在使开发人员生活更轻松的工具) ADO.NET is a .NET technology designed to make writing code against the database more easy. It's not a database (SQL Server is a Databas ... -
ADO.NET获取列标题(ADO.NET get column header)[2023-05-09]
您需要Clone DataTable。 使用DataTable.Clone方法。 DataTable dt = dt1.Clone(); 如果您只想复制列名并在另一个DataTable中创建具有相同名称的列,您可以执行以下操作: foreach (DataColumn dc in dt1.Columns) { dt2.Columns.Add(dc.ColumnName); } 如果您只需要列名,那么您可以获得List而不是新的DataTable。 喜欢: List ... -
我无法看到OLE如何为统一DAL提供灵丹妙药。 您希望使用最适合数据源的数据访问框架,并从应用程序中抽象出实现。 我的猜测是你希望使用OLE将允许一些语法统一。 但这种情况并非如此。 一旦你尝试做一些像分页这样的事情,每个数据源都会有自己的怪癖,你如何连接到源代码并不能帮助统一语法差异。 例如,在分页的情况下,SQLite使用SKIP,TAKE。 Oracle使用ROWNUM。 Sql Server使用TOP。 我会通过创建一个DAL来解决问题,该DAL将实体类从数据源中抽象出来。 然后,您可以使用最适合数 ...
-
如果你的表,真的很小(即10行)为什么不只是检索所有10行,并通过它们遍历到第5 /第7行......直接选择它们... ...你的桌子怎么样key'd。 即什么决定第5和第7行是什么? 您是否在查询中应用ORDER BY ... 如果你想根据某个特定的顺序从顶端获得第7排,你可以做一些UGLY赞。 SELECT Top 1 * FROM ( SELECT Top 7 * FROM TABLE ORDER BY 1 ASC ) as a O ...
-
您可以将数据集传递到DataAdapter的Update语句, 该 语句 将更新数据集中的所有表。 更新:不,它没有。 DataAdapter始终只更新一个表。 从MSDN文档中以DataSet作为参数的Update()重载“从名为”Table“的DataTable中为指定DataSet中的每个插入,更新或删除的行调用相应的INSERT,UPDATE或DELETE语句“。 对困惑感到抱歉。 然而,答案的其余部分仍然有效。 如果要确保所有更新都作为原子单元成功或失败,请使用SqlTransaction对象: ...
-
我能想到的两个选择: 使用作为sql标准一部分的INFORMATION_SCHEMA视图会很好,但并非所有数据库系统都实现它们。 但是,如果您关心的数据库集实现了它,那么这是您的最佳选择。 另一种选择是接受您的查询,但在其上添加“WHERE 1 = 0”子句,以便它不返回任何行。 在这种情况下,ADO.NET仍将返回架构 编辑:实际上,第二种方法将为您提供列及其数据类型的存在。 但是,我不确定您是否会获得完整的架构信息,如最大长度,NULLable等.INFORMATION_SCHEMA视图确实是最好的选择 ...
-
如何从Ado.Net中的VARCHAR中检索Bytes []?(How to get to retrieve Bytes[] from VARCHAR in Ado.Net?)[2022-04-26]
给出一张桌子 create table foobar ( id int not null primary key , some_text varchar(2000) not null , ) 要将some_text检索为八位字节: select id = id , some_octets = convert(varbinary(2000),some_text) from foobar 插入和更新: declare @id int ... -
您有多种方式,例如: 使用SqlDataAdapter填充DataTable : DataTable table = new DataTable(); using (var con = new SqlConnection("connection string")) using (var da = new SqlDataAdapter("Sql-Query", con)) da.Fill(table); object secondRowSecondColumnValue = table.Rows[1] ...