小编Jan*_*omä的帖子

如何在Solr中进行IN查询?

我的文档有一个多值字段"sharedTo",其中包含文档共享的组.现在,我想查找至少与给定组列表中的一个共享的所有文档.例如,我想查找与组"foo"或组"bar"或两者共享的所有文档.目前我正在构建这样的查询:

sharedTo:"foo" OR sharedTo:"bar"
Run Code Online (Sandbox Code Playgroud)

对于每个组,我只需添加一个新的OR查询部分.这是有效的,但是我想知道是否有更有效的方法来做这个

sharedTo IN ('foo', 'bar')
Run Code Online (Sandbox Code Playgroud)

syntax solr

29
推荐指数
1
解决办法
3万
查看次数

为什么我要使用java.lang.Class.cast

我最近偶然发现了一段像这样的代码:

Object o = .. ;
Foo foo = Foo.class.cast(o);
Run Code Online (Sandbox Code Playgroud)

我实际上甚至不知道java.lang.Class有一个强制转换方法,所以我查看了文档,从我收集的内容中,这只是对类对象所代表的类进行强制转换.所以上面的代码大致相当于

Object o = ..;
Foo foo = (Foo)o;
Run Code Online (Sandbox Code Playgroud)

所以我想知道,为什么我会想要使用强制转换方法而不是简单地进行"旧方法".有没有一个很好的例子,使用cast方法比简单的转换更有益?

java generics language-construct

19
推荐指数
2
解决办法
4245
查看次数

Flink Streaming:如何根据数据将一个数据流输出到不同的输出?

在Apache Flink中,我有一组元组.让我们假设一个非常简单Tuple1<String>.元组可以在其值字段中具有任意值(例如,"P1","P2"等).可能值的集合是有限的,但我事先并不知道全集(所以可能有'P362').我想根据元组内部的值将该元组写入某个输出位置.所以我希望有以下文件结构:

  • /output/P1
  • /output/P2

在文档中我只发现了写入我事先知道的位置的可能性(例如stream.writeCsv("/output/somewhere")),但没有办法让数据的内容决定数据实际结束的位置.

我在文档中读到了关于输出拆分的内容,但这似乎没有提供一种方法将输出重定向到我希望拥有它的方式(或者我只是不明白这是如何工作的).

可以使用Flink API完成,如果是这样,怎么做?如果没有,是否可能有第三方图书馆可以做到这一点,还是我必须自己构建这样的东西?

更新

根据Matthias的建议,我想出了一个筛选接收函数,它确定输出路径,然后在序列化之后将元组写入相应的文件.我把它放在这里作为参考,也许对其他人有用:

public class SiftingSinkFunction<IT> extends RichSinkFunction<IT> {

    private final OutputSelector<IT> outputSelector;
    private final MapFunction<IT, String> serializationFunction;
    private final String basePath;
    Map<String, TextOutputFormat<String>> formats = new HashMap<>();

    /**
     * @param outputSelector        the selector which determines into which output(s) a record is written.
     * @param serializationFunction a function which serializes the record to a string.
     * @param basePath              the base path for writing the records. It will be appended …
Run Code Online (Sandbox Code Playgroud)

java bigdata apache-flink flink-streaming

18
推荐指数
1
解决办法
5293
查看次数

如何使用Spock模拟有效地模拟流畅的界面?

我想用mock模拟一些流畅的界面,这基本上是一个邮件生成器:

this.builder()
            .from(from)
            .to(to)
            .cc(cc)
            .bcc(bcc)
            .template(templateId, templateParameter)
            .send();
Run Code Online (Sandbox Code Playgroud)

使用Spock进行模拟时,需要进行大量的设置:

def builder = Mock(Builder)
builder.from(_) >> builder
builder.to(_) >> builder 
Run Code Online (Sandbox Code Playgroud)

当你想根据用例测试与模拟的某些交互时,它变得更加麻烦.所以我在这里基本上有两个问题:

  1. 有没有办法结合模拟规则,以便我可以在一个方法中进行一般的一次性设置流程接口,我可以在每个测试用例上重复使用,然后为每个测试用例指定其他规则?
  2. 有没有办法用较少的代码指定一个流畅的接口的模拟,例如:

    def builder = Mock(Builder)builder./(from|to|cc|bcc |template)/(*) >> builder

    或类似于Mockito的Deep Stubs的东西(参见http://docs.mockito.googlecode.com/hg/org/mockito/Mockito.html#RETURNS_DEEP_STUBS)

groovy unit-testing spock

15
推荐指数
1
解决办法
2115
查看次数

如何在规范类之外创建Spock模拟?

我们将Spock测试与Spring的@ContextConfiguration结合起来,这样我们就可以在spring上下文中构建bean,然后使用Spock进行实际测试.我们想把spock mocks注入我们的春豆.对于Mockito,有一个扩展,允许您执行以下操作:

 <mockito:mock id="accountService" class="org.kubek2k.account.DefaultAccountService" />
Run Code Online (Sandbox Code Playgroud)

然后将这个模拟引用到其他spring bean.Spock似乎没有这样的扩展.如果您知道如何在Specification类之外创建Mocks,那么再次构建它可能不会太费力.创建我所知道的Spock模拟的唯一方法是:

T Mock(Class<T> type)   
Run Code Online (Sandbox Code Playgroud)

在规范中.Spock中是否有一些API可以在不在Specification类中时创建Mocks,所以我可以为Spring上下文创建Spock模拟?

spring unit-testing spock

14
推荐指数
3
解决办法
4786
查看次数

为什么我不会在每个延迟加载的关系中使用@BatchSize?

hibernate的@BatchSize注释允许批量提取延迟加载的实体.例如,如果我有类似的东西:

public class Product {


    @OneToMany(fetchType=LAZY)
    @BatchSize(size=10)
    private ProductCategory category;

}
Run Code Online (Sandbox Code Playgroud)

现在,如果我得到产品的类别,Hibernate将获取最多十个产品的类别,这些产品在当前会话中并且尚未初始化其类别字段.这样可以节省大量SQL调用数据库.到现在为止还挺好.现在我想知道为什么我不会在每个懒惰的加载关系上使用@BatchSize注释?毕竟为什么我想要额外调用数据库?显然必须有这样的原因,否则Hibernate的人可能会把它作为默认,但我目前看不到它.

java performance hibernate

12
推荐指数
2
解决办法
8337
查看次数

如何为spring Web流定义自定义消息源?

spring webflow文档提到他们向流添加消息的方法是在流中的文件messages.properties中定义关于该流的所有消息:

国际化消息在Spring MessageSource访问的消息包中定义.要创建特定于流的消息包,只需在流的目录中定义messages.properties文件即可.为您需要支持的每个其他区域设置创建默认的messages.properties文件和.properties文件.

在我们的webapp中,我们使用Spring Webflow和专有框架.我们将所有国际化消息都放在一个文件中,我们希望Spring Webflow可以访问这个消息,而不是使用几十个属性文件乱丢我们的项目.有没有办法为spring webflow配置消息源,还是我们坚持使用messages.properties?

spring internationalization spring-webflow

9
推荐指数
1
解决办法
2637
查看次数

使用Spring Data JPA自动转换参数

在我们的实体bean中,我们使用自定义ID格式,其中包含校验和以验证ID实际上是否有效.Ids看起来像ID827391738979.为了确保所有代码只使用正确的ID,我们在ID String周围创建了一个代码包装器:

class ID {
    public ID(String id) {
       // parse and verify ID
    }

    public String toString() {
       return id;
    }
}
Run Code Online (Sandbox Code Playgroud)

所有代码都使用此ID对象.但是在我们的实体中,我们将ID定义为String:

class SomeEntity {
    @Column
    private String itsID;
}
Run Code Online (Sandbox Code Playgroud)

现在我们想使用Spring-Data-JPA通过它的id查询一些对象.所以我们这样做:

public SomeEntity findByItsID(ID itsId);
Run Code Online (Sandbox Code Playgroud)

问题是,现在Spring Data JPA尝试将ID类型参数分配给查询,而查询当然需要a String.

是否可以让Spring Data JPA在将参数插入查询之前将参数转换为期望的类型(例如通过注册Spring转换器)?或者,我们是否必须让方法采用这样的字符串:

public SomeEntity findByItsId(String itsId);
Run Code Online (Sandbox Code Playgroud)

我宁愿避免这种情况,因此所有代码都可以使用ID该类而不是使用字符串.

java spring jpa spring-data spring-data-jpa

9
推荐指数
1
解决办法
1万
查看次数

玩!框架:在单独的JavaScript文件中使用URL的最佳实践?

我正在重组Play!项目中HTML模板文件中有很多JS代码.此代码应移至外部JS文件,以提高可读性和加快页面加载速度.但是,当我在公共文件夹中创建一个JS文件时,所有@ {Controller.method}链接替换都不再起作用.我正在考虑从HTML模板调用一些初始化函数,它只提供所需的URL

initialize({ "Application.doThis" : "@{Application.doThis}"})
Run Code Online (Sandbox Code Playgroud)

但是,添加任何URL都会变得非常麻烦且容易出错.另一件事是,I18N也不再适用.那么这些场景的最佳实践是什么,你将JS代码放在一个单独的文件中,但仍想在你的JS中使用URL生成和I18N?

javascript frameworks external playframework

8
推荐指数
2
解决办法
3834
查看次数

将Solr的TermsComponent中的条款限制为源自某些文档的条款

我正在使用Solrs TermsComponent来实现自动完成功能.我的文档包含我在"标签"字段中编入索引的标签.现在,我可以使用TermsComponent找出所有存储文档中使用的标记.到目前为止,这非常有效.

但是还有一些额外的要求:每个文档都有一个所有者字段,其中包含拥有它的用户的ID.自动填充列表应仅包含文档中的标记,请求自动填充的用户实际拥有该标记.

我试图设置查询参数,但这似乎被TermsComponent忽略:

public static List<String> findUniqueTags(String beginningWith, User owner) throws IOException {
    SolrParams q = new SolrQuery().setQueryType("/terms")
            .setQuery("owner:" + owner.id.toString())
            .set(TermsParams.TERMS, true).set(TermsParams.TERMS_FIELD, "tags")
            .set(TermsParams.TERMS_LOWER, beginningWith)
            .set(TermsParams.TERMS_LOWER_INCLUSIVE, false)
            .set(TermsParams.TERMS_PREFIX_STR, beginningWith);
    QueryResponse queryResponse;
    try {
        queryResponse = getSolrServer().query(q);
    } catch (SolrServerException e) {
        Logger.error(e, "Error when querying server.");
        throw new IOException(e);
    }

    NamedList tags = (NamedList) ((NamedList)queryResponse.getResponse().get("terms")).get("tags");

    List<String> result = new ArrayList<String>();
    for (Iterator iterator = tags.iterator(); iterator.hasNext();) {
        Map.Entry tag = (Map.Entry) iterator.next();
        result.add(tag.getKey().toString());
    }
    return result;
}
Run Code Online (Sandbox Code Playgroud)

那么有没有办法限制由TermsComponent返回的标签,还是我手动查询用户的所有标签并自己过滤?

solr autocomplete solrj

7
推荐指数
1
解决办法
2915
查看次数