首页 \ 问答 \ 干草堆多场搜索(haystack multiple field search)

干草堆多场搜索(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
更新时间:2022-11-04 12:11

最满意答案

您有多种方式,例如:

使用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 a 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];

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.

相关问答

更多
  • 每个特定的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是一种.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 ...
  • 您需要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视图确实是最好的选择 ...
  • 给出一张桌子 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] ...

相关文章

更多

最新问答

更多
  • 您如何使用git diff文件,并将其应用于同一存储库的副本的本地分支?(How do you take a git diff file, and apply it to a local branch that is a copy of the same repository?)
  • 将长浮点值剪切为2个小数点并复制到字符数组(Cut Long Float Value to 2 decimal points and copy to Character Array)
  • OctoberCMS侧边栏不呈现(OctoberCMS Sidebar not rendering)
  • 页面加载后对象是否有资格进行垃圾回收?(Are objects eligible for garbage collection after the page loads?)
  • codeigniter中的语言不能按预期工作(language in codeigniter doesn' t work as expected)
  • 在计算机拍照在哪里进入
  • 使用cin.get()从c ++中的输入流中丢弃不需要的字符(Using cin.get() to discard unwanted characters from the input stream in c++)
  • No for循环将在for循环中运行。(No for loop will run inside for loop. Testing for primes)
  • 单页应用程序:页面重新加载(Single Page Application: page reload)
  • 在循环中选择具有相似模式的列名称(Selecting Column Name With Similar Pattern in a Loop)
  • System.StackOverflow错误(System.StackOverflow error)
  • KnockoutJS未在嵌套模板上应用beforeRemove和afterAdd(KnockoutJS not applying beforeRemove and afterAdd on nested templates)
  • 散列包括方法和/或嵌套属性(Hash include methods and/or nested attributes)
  • android - 如何避免使用Samsung RFS文件系统延迟/冻结?(android - how to avoid lag/freezes with Samsung RFS filesystem?)
  • TensorFlow:基于索引列表创建新张量(TensorFlow: Create a new tensor based on list of indices)
  • 企业安全培训的各项内容
  • 错误:RPC失败;(error: RPC failed; curl transfer closed with outstanding read data remaining)
  • C#类名中允许哪些字符?(What characters are allowed in C# class name?)
  • NumPy:将int64值存储在np.array中并使用dtype float64并将其转换回整数是否安全?(NumPy: Is it safe to store an int64 value in an np.array with dtype float64 and later convert it back to integer?)
  • 注销后如何隐藏导航portlet?(How to hide navigation portlet after logout?)
  • 将多个行和可变行移动到列(moving multiple and variable rows to columns)
  • 提交表单时忽略基础href,而不使用Javascript(ignore base href when submitting form, without using Javascript)
  • 对setOnInfoWindowClickListener的意图(Intent on setOnInfoWindowClickListener)
  • Angular $资源不会改变方法(Angular $resource doesn't change method)
  • 在Angular 5中不是一个函数(is not a function in Angular 5)
  • 如何配置Composite C1以将.m和桌面作为同一站点提供服务(How to configure Composite C1 to serve .m and desktop as the same site)
  • 不适用:悬停在悬停时:在元素之前[复制](Don't apply :hover when hovering on :before element [duplicate])
  • 常见的python rpc和cli接口(Common python rpc and cli interface)
  • Mysql DB单个字段匹配多个其他字段(Mysql DB single field matching to multiple other fields)
  • 产品页面上的Magento Up出售对齐问题(Magento Up sell alignment issue on the products page)